ได้รับจำนวนเต็มบวก K และอาร์เรย์ Ops[] เป้าหมายคือหาจำนวนการดำเนินการที่ต้องทำเพื่อให้ K < 0
กติกาการดำเนินการ
- การดำเนินการครั้งแรก: K + Ops[0]
- ต่อไป: บวก Ops[i] ต่อเนื่องedly โดย i วิ่งแบบวนรอบ (circular) 0 ≤ i < N จนกว่า K < 0
ข้อสังเกตสำคัญ
ถ้าผลรวมของ Ops[] ≥ 0 แล้ว K จะไม่มีวันน้อยกว่า 0 → คืนค่า -1
ตัวอย่าง
อินพุต: ops[] = {-4, 2, -3, 0, 2}, K = 5
เอาต์พุต: 3
ขั้นตอน: 5+(-4)=1, 1+2=3, 3+(-3)=0 (ยังไม่ <0) ต่อไป...
อินพุต: ops[] = {5, 5, 3, -2}, K = 10
เอาต์พุต: K cannot be reduced!! (ผลรวม ops = 11 > 0)
ตัวอย่างโค้ด C++
#include <bits/stdc++.h>
using namespace std;
long countOperations(int op[], int n, int k) {
long count = 0;
int sum = 0;
for (int i = 0; i < n; i++) sum += op[i];
if (sum >= 0) return -1; // K ไม่มีวันลดลง
while (k > 0) {
for (int i = 0; i < n; i++) {
if (k > 0) {
count++;
k += op[i];
} else break;
}
}
return count;
}
int main() {
int Ops[] = {1, -1, 5, -11};
int len = sizeof(Ops) / sizeof(Ops[0]);
int K = 10;
long ans = countOperations(Ops, len, K);
if (ans == -1) cout << "K cannot be reduced!!";
else cout << "Number of operations: " << ans;
return 0;
}
ผลลัพธ์
Number of operations: 8