这题用二分答案和贪心思想,为了让前面的人尽可能少的抄写,就从后往前分配任务,用贪心思想,先尽量分配任务,直到超过检验的x再分配给下一个人,最后判断人数是否满足条件,最后输出的时候也逆序输出就行了
`#include<stdio.h>
include<stdlib.h>
include<string.h>
include<bits/stdc++.h>
using namespace std;
int check(int *lst,int m,int k,int z){
int cnt=0,sum=0;
for(int i=m-1;i>=0;i--){
sum+=lst[i];
if(sum>z){
cnt++;
sum=lst[i];
}
}
if(cnt<=k-1) return 1;
return 0;
}
int main(){
int m,k,a=0,sum=0;
int lst[507];
scanf("%d %d",&m,&k);
for(int i=0;i<m;i++){
scanf("%d",&lst[i]);
sum+=lst[i];
}
int l=sum/k,r=sum,ye=sum;
while(l<=r){
int z=(l+r)/2;
if(check(lst,m,k,z)){
if(z<ye) ye=z;
r=z-1;
}
else l=z+1;
}
int index[m],t=1;
index[0]=m;
for(int i=m-1;i>=0;i--){
a+=lst[i];
if(a>ye){
index[t]=i+2;
t++;
index[t]=i+1;
t++;
a=lst[i];
}
}
printf("1 ");
for(int i=2*k-2;i>=0;i--){
printf("%d",index[i]);
if(i%2==0) printf("\n");
else printf(" ");
}
return 0;
} `