poj 3273-Monthly Expense链接:http://poj.org/problem?id=3273
这样的在最优情况下找最短时间的题一般都可以二分,当然还可以dp,但是因为本题的数据较大,dp会很耗时,也会很费空间,所以用二分的方法,从max(a[i])到sum(a[i])进行逼近。
View Code
1 #include<stdio.h>
2 #include<string.h>
3 #define MAX 305
4 int v[MAX];
5 int main()
6 {
7 int n,m;
8 int sum,max;
9 int i;
10 int l,r,mid;
11 int t;
12 scanf("%d",&t);
13 while(t--)
14 {
15 scanf("%d%d",&n,&m);
16 sum=0;
17 max=0;
18 for(i=0;i<n;i++)
19 {
20 scanf("%d",&v[i]);
21 sum+=v[i];
22 if(v[i]>max)
23 max=v[i];
24 }
25 r=sum;
26 l=max;
27 int sumstep,mins;
28 while(l<r)
29 {
30 mid=(l+r)>>1;
31 sumstep=mins=0;
32 for(i=0;i<n;i++)
33 {
34 sumstep+=v[i];
35 if(sumstep>mid)
36 {
37 sumstep=0;
38 mins++;
39 i--;//从这个节点重新开始计算
40 }
41 }
42 mins++;
43 if(mins>m)
44 l=mid+1;
45 else
46 r=mid-1;
47 }
48 printf("%d\n",l);
49 }
50 return 0;
51 }