导航

Codeforces 626C Block Towers「贪心」「二分」「数学规律」

Posted on 2016-03-06 09:14  tun~  阅读(220)  评论(0编辑  收藏  举报

题意:

一堆人用方块盖塔,有n个人每次只能加两块方块,有m个人每次只能加三块方块。要求每个人盖的塔的高度都不一样,保证所用方块数最少,求最高的塔的高度。

0<=n+m  0<=n,m<=1e6

思路:

根据容斥原理,n和m个人如果都按照等差为2或者3的序列盖塔的话那么重复的个数应该是塔高较小的那组除以6,然后....一开始顺着这个思路想把自己坑了...

其实可能的塔高是有规律的 2 3 4 6 8 9 10 12...每六个中有三个,所以干脆先打表了,那么知道n和m之后,至少需要n+m种塔高。然后二分需要塔高的数目使得最高的塔高同时满足两种需要。

#include<bits/stdc++.h>
using namespace std;
int biao[2000050];
int bSearch(int l,int r,int n,int m){
    int mid;
    while(l<=r){
        mid=(l+r)>>1;
        if(biao[mid]/2>=n&&biao[mid]/3>=m){
            r=mid-1;
        }
        else{
            l=mid+1;
        }
    }
    return l;
}
int main()
{
    for(int i=1;i<=2000010;i++){
        biao[i]=(i-1)/4*6;
        if(i%4==1)biao[i]+=2;
        else if(i%4==2)biao[i]+=3;
        else if(i%4==3)biao[i]+=4;
        else biao[i]+=6;
    }
    int n,m;
    cin>>n>>m;
    cout<<biao[bSearch(n+m,2000000,n,m)];
}