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


    题意:

    一堆人用方块盖塔,有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)];
    }
  • 相关阅读:
    修改服务器时间及时区
    风情万种awk
    追忆似水流年sed
    lvm笔记
    正则不怎么会用
    在CentOS7.5的虚拟环境下新建你的django项目
    Django学习过程中的排错总结
    我一直记不住的vim用法
    关于自建yum源拾遗
    Djangp2.x版本报错找不到模版目录下的文件
  • 原文地址:https://www.cnblogs.com/tun117/p/5246539.html
Copyright © 2020-2023  润新知