最大值最小化

 1 #include<stdio.h>
 2 
 3 int a[10000];
 4 int n,m;
 5 
 6 int is_part(int u)
 7 {
 8     int sum,i,count,ok;
 9     sum=count=0;ok=1;
10     for(i=0;i<n;i++)
11     {
12         if(a[i]>u)
13         {
14             ok=0;
15             break;
16         }
17         if(sum+a[i]>u) 
18         { 
19             sum=a[i],
20             count++;
21             if(count==m)
22             {
23                 ok=0;
24                 break;
25             }
26         }
27         else    sum+=a[i];
28     }
29     return ok;
30 }
31 
32 
33 int fun(int x,int y)
34 {
35     int m;
36     while(x<y)
37     {
38         m=x+(y-x)/2;
39         if(is_part(m)) y=m;
40         else x=m+1;
41     }
42     return x;
43 }
44 
45 int main()
46 {
47     int i,j,max,sum;
48     while(scanf("%d%d",&n,&m)!=EOF)
49     {
50         max=sum=0;
51         for(i=0;i<n;i++)
52         {
53             scanf("%d",&a[i]);
54             max=max>a[i]?max:a[i];
55             sum+=a[i];
56         }
57         j=fun(max,sum);
58         printf("%d\n",j);
59         sum=0;
60         for(i=0;i<n;i++)
61         {
62             sum+=a[i];
63             if(sum>j) 
64             {
65                 sum=a[i];
66                 printf("| ");
67             }
68             printf("%d ",a[i]);
69         }
70         printf("\n");
71     }
72     return 0;
73 }
74             
75 /*
76 6 3
77 1 2 3 2 5 4
78 
79 
80 7
81 1 2 3 | 2 5 | 4
82 */
 1 #include<stdio.h>
 2 
 3 int a[10000];
 4 int n,m;
 5 
 6 int is_part(int u)
 7 {
 8     int sum,i,count,ok;
 9     sum=count=0;ok=1;
10     for(i=0;i<n;i++)
11     {
12         if(a[i]>u)
13         {
14             ok=0;
15             break;
16         }
17         if(sum+a[i]>u) 
18         { 
19             sum=a[i],
20             count++;
21             if(count==m)
22             {
23                 ok=0;
24                 break;
25             }
26         }
27         else    sum+=a[i];
28     }
29     return ok;
30 }
31 
32 
33 int fun(int x,int y)
34 {
35     int m;
36     while(x<y)
37     {
38         m=x+(y-x)/2;
39         if(is_part(m)) y=m;
40         else x=m+1;
41     }
42     return x;
43 }
44 
45 int main()
46 {
47     int i,j,max,sum;
48     while(scanf("%d%d",&n,&m)!=EOF)
49     {
50         max=sum=0;
51         for(i=0;i<n;i++)
52         {
53             scanf("%d",&a[i]);
54             max=max>a[i]?max:a[i];
55             sum+=a[i];
56         }
57         j=fun(max,sum);
58         printf("%d\n",j);
59         sum=0;
60         for(i=0;i<n;i++)
61         {
62             sum+=a[i];
63             if(sum>j) 
64             {
65                 sum=a[i];
66                 printf("| ");
67             }
68             printf("%d ",a[i]);
69         }
70         printf("\n");
71     }
72     return 0;
73 }
74             
75 /*
76 6 3
77 1 2 3 2 5 4
78 
79 
80 7
81 1 2 3 | 2 5 | 4
82 */
原文地址:https://www.cnblogs.com/xiaofanke/p/3053709.html