1 //目标学会用猜数字(二分)的方法,换个角度来解决问题 2 #include3 #include 4 #include 5 const int N = 100000; 6 7 int a[N],n,m,max; 8 9 void input()10 {11 scanf("%d%d",&n,&m);12 max=0;13 for(int i=0;i ?= a[i];17 }18 }19 20 bool is_part(int x)//是否能把序列划分为每个序列之和不大于x的m个子序列 21 {22 //每次往右划分,划分完后,所用的划分线不大于m-1个即可23 int t=0,s=0;24 bool ok=true;25 26 for(int i=0;i x)33 {34 ok=false;35 break;36 }37 if(s+a[i]>x)//大于,不能再把当前元素加上了 38 {39 t++;//多用了一条横杠40 s=a[i];41 /*42 t=m时退出,即在最后一个元素之前都已经用了m条划分线,此时已把序列划分成了m+1个序列,太过分了,让其适可而止 43 */44 if(t>m-1)45 {46 ok=false;47 break;48 }49 }else50 {51 s+=a[i];//把当前元素与前面的元素连上,以便尽量往右划分,贪心到底 52 }53 }54 55 return ok;56 }57 58 int sum()59 {60 int s=0;61 for(int i=0;i
此为转载……貌似是个高中生写的,太牛了……