[VijosP1639]机密文件 题解

题目大意:

  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
",ans[p+1]-1);
40     for (i=p+1;i<m;i++) printf("%d %d
",ans[i],ans[i+1]-1);
41     printf("%d %d",ans[m],n);
42     return 0;
43 }
原文地址:https://www.cnblogs.com/HHshy/p/6059821.html