最大值最小化(最大值儘量小)
阿新 • • 發佈:2018-12-11
給出是個序列,如1 2 3 2 5 4 ,將其劃分成m個連續的子序列,每個子序列最少有一個元素,怎樣使每個子序列的和的最大值最小
#include <iostream> #include <ctime> using namespace std; #define N 10 #define INF 1000 int juge(int a[],int mid,int k) { int i; int seg=0; int sum=0; for(i=0;i<N;i++) { sum+=a[i]; if(sum>mid) //從左到右將陣列元素之和與mid比較,如是大於則再起一段,最後看段的大小 { sum=a[i]; seg++; } } if(seg>=k) //若是段超過3,則必然不和條件 return 0; else return 1; } int value(int a[],int low,int high,int segment) //分治法求解 { if(low>high) return high+1; else { int mid=(low+high)/2; if(juge(a,mid,segment)==1) //如果試驗數mid符合要求,遞迴到前一半 return value(a,low,mid-1,segment); else //如果試驗數mid不符合要求,遞迴到後一半 return value(a,mid+1,high,segment); } } int main() { srand((unsigned)time(NULL)); int a[N]; for(int ifor=0;ifor<N;ifor++) a[ifor]=rand()%20; for(ifor=0;ifor<N;ifor++) cout<<a[ifor]<<" "; //int a[N]={9,19,15,13,13,9,14,1,1,7}; int m=3; cout<<endl; //求出佇列中所有數的和max,還要求出當中最小的數min int min=INF,max=0; for(int i=0;i<N && a[i]!=' ';i++) { max+=a[i]; if(a[i]<min) min=a[i]; } cout<<endl; int tem=value(a,min,max,m); //呼叫value函式求值 cout<<tem<<endl; return 0; }