সমস্যা বিবরণ
কনsekutিভ ডিজিটের একটি স্ট্রিং এবং একটি নম্বর Y দেওয়া আছে। টাস্ক হলো মিনিমাম সেটের সংখ্যা বের করা যাতে প্রতিটি সেট নিচের রুল মেনে চলে:
- সেটে কনsekutিভ নম্বর থাকবে
- কোনো ডিজিট একবারই ব্যবহার করা যাবে
- সেটের নম্বর Y-র চেয়ে বড় হবে না
উদাহরণ
যদি str = "1234" এবং Y = 20 হয়, তবে উত্তর ৩ কারণ নিচের সেটগুলো তৈরি হয়:
{12} {3} এবং {4}
অ্যালগরিদম
- স্ট্রিংকে নম্বরে কনভার্ট করুন
- যদি নম্বরটি Y-র চেয়ে বড় না হয়, তবে f = 1 চিহ্নিত করুন
- যদি নম্বর Y-এর চেয়ে বড় হয়, তবে f = 1 হলে কাউন্ট বড়ান এবং f = 0 রি-ইনিশিয়ালাইজ করুন এবং num = s[i]-'0' বা num = 0 করুন
- স্ট্রিং সম্পূর্ণ ইটারেট করার পর, f = 1 হলে কাউন্ট বড়ান
উদাহরণ
#include <iostream>
#include <string>
using namespace std;
int getMinSets(string str, int y) {
int cnt = 0;
int num = 0;
int l = str.length();
int f = 0;
for (int i = 0; i < l; ++i) {
num = num * 10 + str[i] - 48;
if (num <= y) {
f = 1;
continue;
}
if (f) {
++cnt;
}
num = str[i] - '0';
f = 0;
if (num <= y) {
f = 1;
} else {
num = 0;
}
}
if (f) {
++cnt;
}
return cnt;
}
int main() {
string str = "1234";
int y = 20;
cout << "Minimum sets = " << getMinSets(str, y) << endl;
return 0;
}
আউটপুট
যখন আপনি উপরের প্রোগ্রাম কম্পাইল ও এক্সিকিউট করবেন। এটি নিচের আউটপুট জেনারেট করবে:
Minimum sets = 3