题目大意:
m个人抄n份资料,资料有编号,每人抄连续的几份资料,每份资料页数不一定相等,每个人抄的速度相同,求使得总时间最少的方案(总时间相同,越前面的人抄的越少)
思路:
假设每人一天抄一页,二分天数,倒着安排资料即可。
代码:
1 #include<cstdio> 2 int n,m,l,r,i,p,a[1001],ans[1001]; 3 4 bool check(int x) 5 { 6 int i=n,t=0,cnt=0; 7 for (;i>=0;--i) 8 { 9 t=t+a[i]; 10 if (t>x) 11 { 12 t=0; ++i; 13 if (++cnt>m) return 0; 14 } 15 } 16 if (t) t=1; 17 return t+cnt<=m; 18 } 19 20 int main() 21 { 22 scanf("%d%d",&n,&m); 23 for (i=1;i<=n;i++) scanf("%d",&a[i]),r=r+a[i]; 24 for (l=0;l<r;) 25 { 26 int mid=l+r>>1; 27 if (check(mid)) r=mid; else l=mid+1; 28 } 29 r=0,p=m; 30 for (i=n;i;--i) 31 { 32 r=r+a[i]; 33 if (r>l) 34 { 35 r=0; 36 ans[p--]=++i; 37 } 38 } 39 printf("1 %d\n",ans[p+1]-1); 40 for (i=p+1;i<m;i++) printf("%d %d\n",ans[i],ans[i+1]-1); 41 printf("%d %d",ans[m],n); 42 return 0; 43 }
时间: 2024-10-12 13:11:27