---------12.2
cf 又滚粗
cf 604 b
http://codeforces.com/contest/604/problem/B
给出 n 个物品,每个物品的体积是 s[i],现在把它们装进 k 个盒子里面,每个盒子里面最多装两个物品
问盒子的最小体积(每个物品的体积按照升序给出的)
二分盒子的体积,但是以为是只有相邻的两个物品可以放进同一个盒子里面
所以被hack
一直想不通
hack 点是
4 2
1 5 5 9
应该是 10
应该依次考虑有没有物品能够和当前最大的一起放,
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<algorithm> 5 using namespace std; 6 7 const int INF = (1<<30)-1; 8 const int maxn = 1e6+5; 9 int s[maxn],n,k; 10 int flag[maxn]; 11 int cnt; 12 13 int ok(int x){ 14 cnt = 0; 15 if(x <s[n]) return 0; 16 int i = 1,j = n; 17 for(;i <= j;){ 18 if(i == j) { 19 cnt++; 20 j--; 21 } 22 else if((s[i]+s[j]) <= x){ 23 i++; 24 j--; 25 cnt++; 26 } 27 else { 28 j--; 29 cnt++; 30 } 31 } 32 33 //printf("cnt = %d x = %d\n",cnt,x); 34 return cnt <= k; 35 } 36 37 int lb,ub,mid; 38 39 void solve(){ 40 int ans = INF; 41 ub = 2000000; 42 s[n+1] = INF; 43 for(int i = 0;i <= 100;i++){ 44 mid = (lb+ub)/2; 45 if(ok(mid)){ 46 ub = mid; 47 ans = min(ans,mid); 48 } 49 else lb = mid+1; 50 // printf("lb = %d ub = %d mid = %d ans = %d\n",lb,ub,mid,ans); 51 } 52 printf("%d\n",ans); 53 } 54 55 int main(){ 56 while(scanf("%d %d",&n,&k) != EOF){ 57 memset(s,0,sizeof(s)); 58 lb = INF; 59 for(int i = 1;i <= n;i++) scanf("%d",&s[i]),lb = min(lb,s[i]); 60 solve(); 61 } 62 return 0; 63 }
好sb阿,,,没事,,干巴爹阿---------