একটি ধনাত্মক ইন্টিজার K এবং একটি অ্যারে Ops[] দেওয়া আছে যাতে ইন্টিজার থাকে। লক্ষ্য হল K কত অপারেশন দিয়ে ০-এর নিচে আনা যায় তা বের করা। অপারেশনগুলো:
- প্রথম অপারেশন: K + Ops[0] (প্রথম উপাদান K-এ যোগ)।
- পরে Ops[i] যোগ করতে থাকবে K-এ যতক্ষণ K<0। ইনডেক্স i বৃত্তাকারভাবে (circular) बदলে: 0<=i
নোট: K<0 না হওয়া পর্যন্ত Ops[i] যোগ করতে থাকবে। i শেষ উপাদান Ops[N-1]-এ পৌঁছালে আবার i=0 থেকে শুরু হবে। বৃত্তাকারভাবে।
প্রথমে চেক করা হয় Ops[]-এর সব উপাদানের যোগফল >0 কিনা। হলে K কখনো কমাবে না। -1 রিটার্ন। অন্যথায় Ops[i] যোগ করে K<0 কিনা চেক করে count বাড়ানো হয়।
উদাহরণ
ইনপুট: ops[] = { -4,2,-3,0,2 }, K=5
আউটপুট: সংখ্যা কমাতে প্রয়োজনীয় অপারেশন: ৩
ব্যাখ্যা: K=5। অপারেশন: ১) 5+(-4)=1, ২) 1+2=3, ৩) 3+(-3)=0
ইনপুট: ops[] = { 5,5,3,-2 }, K=10
আউটপুট: K কমানো সম্ভব নয়!!
ব্যাখ্যা: ops[]-এর যোগফল ১১। ১১+১০ সবসময় ধনাত্মক থাকবে। K ০-এর নিচে যাবে না।
অ্যাপ্রোচ
- ইন্টিজার অ্যারে ops[] নেওয়া হয়।
- K ধনাত্মক মান দিয়ে দেওয়া হয়।
countOperations(int op[], int n, int k)ফাংশন K, Ops[] এবং দৈর্ঘ্য গ্রহণ করে K ০-এর নিচে আনতে প্রয়োজনীয় অপারেশন রিটার্ন করে।- প্রাথমিক অপারেশন সংখ্যা count=0।
- ops[]-এর যোগফল sum-এ। sum>=0 হলে -1 রিটার্ন।
- while(k>0) লুপে ops[i] যোগ করে count বাড়ানো হয়। k<0 হলে ব্রেক।
উদাহরণ কোড
#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;
}
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