เราได้รับอาร์เรย์ของจำนวนเต็มบวกและลบและจำนวน K ภารกิจคือการหาผลรวมสูงสุดของอาร์เรย์หลังจากที่ K เปลี่ยนแปลงองค์ประกอบ การดำเนินการเปลี่ยนแปลงครั้งเดียวที่นี่จะคูณองค์ประกอบเดี่ยวด้วย -1
วิธีที่ใช้จะแปลงทุกจำนวนลบเป็นบวก หากมีตัวเลขติดลบ N สำหรับสิ่งนี้ เราจะจัดเรียงอาร์เรย์ -
-
ถ้า N
-
ตอนนี้ถ้า K-N เป็นเลขคู่สำหรับสัญญาณการเปลี่ยนแปลงของ K-N ที่เหลืออยู่จะไม่มีผลอะไรอย่าทำอะไรเลย
-
ถ้า K-N เป็นเลขคี่ สำหรับการดำเนินการ K-N ที่เหลือ ให้เปลี่ยนเครื่องหมายของจำนวนที่น้อยที่สุด (ซึ่งจะกลายเป็นค่าลบ) แต่ผลรวมทั้งหมดจะสูงสุด
หรือ
ถ้า N>K เปลี่ยนเครื่องหมายของตัวเลขลบ K และเพิ่มอาร์เรย์ ผลรวมจะสูงสุด
อินพุต
Arr[]={ 0,-2,6,4,8,2,-3 } K=4
ผลลัพธ์
ผลรวมอาร์เรย์สูงสุดคือ :25
คำอธิบาย − การเปลี่ยนแปลง 4 องค์ประกอบคือ
<ก่อน>1. 0,2,6,4,8,2,-3 -2 เปลี่ยนเป็น 22. 0,2,6,4,8,2,3 -3 เปลี่ยนเป็น 33. 0,-2,6,4,8, 2,3 2 เปลี่ยนเป็น -24 0,2,6,4,8,2,3 -2 เปลี่ยนเป็น 2ผลรวมสูงสุดคือ 25อินพุต
Arr[]={ -1,-2,-3,-4,-5,-6,-7 } K=4
ผลลัพธ์
ผลรวมอาร์เรย์สูงสุดคือ :16
คำอธิบาย − การเปลี่ยนแปลง 4 องค์ประกอบคือ
<ก่อน>1. -1,-2,-3,-4,-5,-6,7 -7 เปลี่ยนเป็น 72. -1,-2,-3,-4,-5,6,7 -6 เปลี่ยนเป็น 63. - 1,-2,-3,-4,5,6,7 -5 เปลี่ยนเป็น 54 -1,-2,-3,4,5,6,7 -4 เปลี่ยนเป็น 4ผลรวมสูงสุดคือ 16แนวทางที่ใช้ในโปรแกรมด้านล่างมีดังนี้
-
อาร์เรย์จำนวนเต็ม Arr[] ใช้เพื่อเก็บจำนวนเต็ม
-
จำนวนเต็ม 'ขนาด' เก็บความยาวของอาร์เรย์และ K ถูกเตรียมใช้งาน
-
ฟังก์ชัน returnSum( int arr[], int n, int k) รับอาร์เรย์ ขนาด และ k เป็นอินพุตและส่งกลับผลรวมสูงสุดขององค์ประกอบหลังจากดำเนินการ k แล้ว
-
ก่อนอื่นเราจะจัดเรียงอาร์เรย์โดยใช้ sort(arr,arr+n)
-
ตอนนี้เราจะใช้การดำเนินการ arr[i]*-1 กับองค์ประกอบเชิงลบทั้งหมดจนกว่าจะถึงดัชนีสุดท้ายหรือ k กลายเป็น 0
-
หาก k น้อยกว่าจำนวนองค์ประกอบเชิงลบ ขั้นตอนข้างต้นจะเปลี่ยนองค์ประกอบ k -ve
-
หาก k มากกว่า และค่าที่เหลือของ k จะถูกตรวจสอบว่าเป็นคี่หรือคู่
-
หาก k เหลือเป็นเลขคี่ เราจะเปลี่ยนค่าขององค์ประกอบขั้นต่ำโดยใช้การดำเนินการ arr[i]*-1 หนึ่งครั้ง โดยที่ arr[i] จะพบอย่างน้อย (คูณด้วย -1 คี่เท่ากับทำครั้งเดียว)
-
หาก k เหลือเป็นคู่ arr[i]*-1 จะไม่มีผลใดๆ ไม่ทำอะไรเลย
-
คำนวณผลรวมของอาร์เรย์ทั้งหมดแล้วส่งคืนผลลัพธ์
ตัวอย่าง
#includeใช้เนมสเปซ std;int returnSum(int arr[], int n, int k){ // จัดเรียงองค์ประกอบอาร์เรย์ sort (arr, arr + n); // เปลี่ยนสัญญาณขององค์ประกอบเชิงลบ // เริ่มจากที่เล็กที่สุด // การวนซ้ำนี้จะเปลี่ยนเครื่องหมายขององค์ประกอบ -ve // สำหรับแต่ละองค์ประกอบ k one -ve จะถูกเปลี่ยนเป็นค่าบวกสำหรับ (i=0;i 0 &&arr[i]<0){ arr[i]=arr[i]*-1; k--;}//ถ้า k ไม่ใช่ศูนย์และเครื่องหมายการเปลี่ยนแปลงคี่ขององค์ประกอบขั้นต่ำ // ครั้งเดียวเหมือนกับการเปลี่ยนเครื่องหมายคี่ timesif (k % 2 ==1) { int min =arr[0]; int pos=0; //index ขององค์ประกอบขั้นต่ำสำหรับ (i =1; i ผลลัพธ์
ผลรวมอาร์เรย์สูงสุดที่สามารถรับได้หลังจากการเปลี่ยนแปลง k ทั้งหมด :24