আমাদের পূর্ণসংখ্যা উপাদান 지닌 একটি অ্যারে দেওয়া আছে যা একটি পলিনোমিয়ালের কোইফিশিয়েন্ট মানগুলো রিপ্রেজেন্ট করে। অ্যারের আকার হবে 'n' অর্থাৎ অ্যারেতে উপাদানগুলোর সংখ্যা। পলিনোমিয়ালের ডিগ্রি সবসময় n-1 থেকে শুরু হয় কারণ পলিনোমিয়াল সিরিজের শেষে একটি কনস্ট্যান্ট মান থাকবে। কাজটি হল কোইফিশিয়েন্টটিকে অন্য পলিনোমিয়াল দিয়ে রিপ্লেস করা যাতে রুটগুলোর যোগফল ন্যূনতম হয়।
বিভিন্ন ইনপুট-আউটপুট পরিস্থিতি দেখে নিই -
ইন - int arr[] = { 2, -1, 4, 9, -1, 10, -5}
আউট - একটি দেওয়া পলিনোমিয়ালের রুটগুলোর যোগফল ন্যূনতম করা: -1 -5 2 4 9 -1 10
ব্যাখ্যা - আমাদের ৭ উপাদান ধারণকারী একটি পূর্ণসংখ্যা অ্যারে দেওয়া আছে অর্থাৎ পলিনোমিয়ালের ঘাত হবে ৬। তাই আমরা ন্যূনতম আউটপুট পাব: -1 * x^6 - 5 * x^5 + 2 * x^4 + 4 * x^3 + 9 * x^2 - 1 * x^1 + 10 যা রুটগুলোর ন্যূনতম যোগফল -5 এবং 1 দেবে।
ইন - int arr[] = {3, -2, -1, 4}
আউট - একটি দেওয়া পলিনোমিয়ালের রুটগুলোর যোগফল ন্যূনতম করা: -1 -2 3 4
ব্যাখ্যা - আমাদের ৪ উপাদান ধারণকারী একটি পূর্ণসংখ্যা অ্যারে দেওয়া আছে অর্থাৎ পলিনোমিয়ালের ঘাত হবে ৩। তাই আমরা ন্যূনতম আউটপুট পাব: -1 * x^3 - 2 * x^2 + 3 * x^1 + 4 যা রুটগুলোর ন্যূনতম যোগফল -1 দেবে।
নিচের প্রোগ্রামে ব্যবহৃত পদ্ধতি
- পূর্ণসংখ্যা উপাদান 지닌 একটি অ্যারে ইনপুট নিন এবং অ্যারের আকার গণনা করুন। ডেটা ফাংশনে পাস করুন आगे প্রসেসিং-এর জন্য।
- Minimize_root(arr, size) ফাংশনের ভিতরে:
- vec_1, vec_2, vec_3 নামে integer টাইপের ভেক্টর ভেরিয়েবল ডিক্লেয়ার করুন।
- i = ০ থেকে অ্যারের আকার পর্যন্ত একটি FOR লুপ শুরু করুন। লুপের ভিতরে চেক করুন IF arr[i] > 0 তবে i কে vec_2-এ push_back করুন। ELSE IF, arr[i] < 0 তবে i কে vec_3-এ push_back করুন।
- vec_2 এবং vec_3-এর আকার গণনা করুন।
- চেক করুন IF vec_2_size >= 2 AND IF vec_3_size >= 2 তবে i = ০ থেকে vec_2-এর আকার পর্যন্ত একটি FOR লুপ শুরু করুন এবং লুপের ভিতরে চেক করুন IF arr[vec_2[i]] > max_val তবে temp = vec_2[i] এবং max_val = arr[temp] সেট করুন।
- i = ০ থেকে vec_2-এর আকার পর্যন্ত একটি FOR লুপ শুরু করুন। লুপের ভিতরে চেক করুন IF arr[vec_2[i]] < min_val তবে চেক করুন IF vec_2[i] != temp তবে temp_2 = vec_2[i] এবং min_val = arr[temp_2] সেট করুন।
- i = ০ থেকে vec_3-এর আকার পর্যন্ত একটি FOR লুপ শুরু করুন। লুপের ভিতরে চেক করুন IF abs(arr[vec_3[i]]) > N_max তবে N_temp = vec_3[i] এবং N_max = abs(arr[N_temp]) সেট করুন।
- i = ০ থেকে vec_3 size পর্যন্ত একটি FOR লুপ শুরু করুন এবং চেক করুন IF abs(arr[vec_3[i]]) < N_min তবে চেক করুন IF vec_3[i] != N_temp তবে N_temp_2 = vec_3[i] এবং N_min = abs(arr[N_temp_2]) সেট করুন।
- চেক করুন IF vec_2_data < vec_3_data তবে i = ০ থেকে অ্যারের আকার পর্যন্ত FOR লুপের ভিতরে চেক করুন IF i != temp_2 AND i != temp তবে arr[i] কে vec_1-এ push_back করুন। ELSE, i = ০ থেকে অ্যারের আকার পর্যন্ত FOR লুপের ভিতরে চেক করুন IF i != N_temp_2 AND i != N_temp তবে arr[i] কে vec_1-এ push_back করুন।
- vec_1 ট্র্যাভার্স করার জন্য একটি FOR লুপ শুরু করুন এবং vec_1[i] প্রিন্ট করুন ফলাফল হিসেবে।
- ELSE IF, vec_2_size >= 2 চেক করুন তবে i = ০ থেকে vec_2-এর আকার পর্যন্ত FOR লুপ শুরু করুন। চেক করুন IF arr[vec_2[i]] > max_val তবে temp = vec_2[i] এবং max_val = arr[temp] সেট করুন।
- i = ০ থেকে vec_2.size() পর্যন্ত FOR লুপ শুরু করুন। লুপের ভিতরে চেক করুন IF arr[vec_2[i]] < min_val তবে চেক করুন IF vec_2[i] != temp তবে temp_2 = vec_2[i] এবং min_val = arr[temp_2] সেট করুন।
- i = ০ থেকে অ্যারের আকার পর্যন্ত FOR লুপ শুরু করুন। লুপের ভিতরে চেক করুন IF i != temp_2 তবে চেক করুন IF i != temp তবে arr[i] কে vec_1-এ push_back করুন।
- ELSE IF, vec_3 >= 2 চেক করুন তবে i = ০ থেকে vec_3 size পর্যন্ত FOR লুপ শুরু করুন এবং চেক করুন IF abs(arr[vec_3[i]]) > N_max তবে temp = vec_3[i] এবং N_max = abs(arr[temp]) সেট করুন।
- i = ০ থেকে vec_3.size() পর্যন্ত FOR লুপ শুরু করুন এবং চেক করুন IF abs(arr[vec_3[i]]) < N_min তবে চেক করুন IF vec_3[i] != temp তবে temp_2 = vec_3[i] এবং N_min = abs(arr[temp_2]) সেট করুন।
- i = ০ থেকে অ্যারের আকার পর্যন্ত FOR লুপ শুরু করুন। চেক করুন IF i != temp_2 তবে চেক করুন IF i != temp তবে arr[i] কে vc_1-এ push_back করুন এবং প্রিন্ট করতে থাকুন।
উদাহরণ
#include <bits/stdc++.h>
using namespace std;
void Minimize_root(int arr[], int size){
vector<int> vec_1;
vector<int> vec_2;
vector<int> vec_3;
for (int i = 0; i < size; i++){
if (arr[i] > 0){
vec_2.push_back(i);
}
else if (arr[i] < 0){
vec_3.push_back(i);
}
}
int vec_2_size = vec_2.size();
int vec_3_size = vec_3.size();
if(vec_2_size >= 2){
if(vec_3_size >= 2){
int max_val = INT_MIN;
int temp = -1;
int min_val = INT_MAX;
int temp_2 = -1;
int N_max = INT_MIN;
int N_temp = -1;
int N_min = INT_MAX;
int N_temp_2 = -1;
for (int i = 0; i < vec_2.size(); i++){
if (arr[vec_2[i]] > max_val){
temp = vec_2[i];
max_val = arr[temp];
}
}
for (int i = 0; i < vec_2.size(); i++){
if (arr[vec_2[i]] < min_val){
if(vec_2[i] != temp){
temp_2 = vec_2[i];
min_val = arr[temp_2];
}
}
}
for (int i = 0; i < vec_3.size(); i++){
if (abs(arr[vec_3[i]]) > N_max){
N_temp = vec_3[i];
N_max = abs(arr[N_temp]);
}
}
for (int i = 0; i < vec_3.size(); i++){
if(abs(arr[vec_3[i]]) < N_min ){
if(vec_3[i] != N_temp){
N_temp_2 = vec_3[i];
N_min = abs(arr[N_temp_2]);
}
}
}
double vec_2_data = -1.0 * (double)max_val / (double)min_val;
double vec_3_data = -1.0 * (double)N_max / (double)N_min;
if (vec_2_data < vec_3_data){
vec_1.push_back(arr[temp_2]);
vec_1.push_back(arr[temp]);
for (int i = 0; i < size; i++){
if (i != temp_2 && i != temp){
vec_1.push_back(arr[i]);
}
}
}
else{
vec_1.push_back(arr[N_temp_2]);
vec_1.push_back(arr[N_temp]);
for (int i = 0; i < size; i++){
if (i != N_temp_2 && i != N_temp){
vec_1.push_back(arr[i]);
}
}
}
for (int i = 0; i < vec_1.size(); i++){
cout << vec_1[i] << " ";
}
}
}
else if(vec_2_size >= 2){
int max_val = INT_MIN;
int temp = -1;
int min_val = INT_MAX;
int temp_2 = -1;
for (int i = 0; i < vec_2.size(); i++){
if (arr[vec_2[i]] > max_val){
temp = vec_2[i];
max_val = arr[temp];
}
}
for (int i = 0; i < vec_2.size(); i++){
if (arr[vec_2[i]] < min_val){
if(vec_2[i] != temp){
temp_2 = vec_2[i];
min_val = arr[temp_2];
}
}
}
vec_1.push_back(arr[temp_2]);
vec_1.push_back(arr[temp]);
int i = 0;
i < size; i++; {
if(i != temp_2){
if(i != temp){
vec_1.push_back(arr[i]);
}
}
}
for (int i = 0; i < vec_1.size(); i++){
cout << vec_1[i] << " ";
}
}
else if(vec_3_size >= 2){
int N_max = INT_MIN;
int temp = -1;
int N_min = INT_MAX;
int temp_2 = -1;
for (int i = 0; i < vec_3.size(); i++){
if (abs(arr[vec_3[i]]) > N_max){
temp = vec_3[i];
N_max = abs(arr[temp]);
}
}
for (int i = 0; i < vec_3.size(); i++){
if(abs(arr[vec_3[i]]) < N_min){
if(vec_3[i] != temp){
temp_2 = vec_3[i];
N_min = abs(arr[temp_2]);
}
}
}
vec_1.push_back(arr[temp_2]);
vec_1.push_back(arr[temp]);
for (int i = 0; i < size; i++){
if (i != temp_2){
if(i != temp){
vec_1.push_back(arr[i]);
}
}
}
for (int i = 0; i < vec_1.size(); i++){
cout << vec_1[i] << " ";
}
}
else {
cout<<"Not Possible";
}
}
int main(){
int arr[] = { 2, -1, 4, 9, -1, 10, -5};
int size = sizeof(arr) / sizeof(arr[0]);
cout<<"Minimize the sum of roots of a given polynomial is: ";
Minimize_root(arr, size);
return 0;
}
আউটপুট
উপরোক্ত কোডটি রান করলে নিচের আউটপুটটি জেনারেট হবে
Minimize the sum of roots of a given polynomial is: -1 -5 2 4 9 -1 10