• 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)];
    }
  • 相关阅读:
    博客园特效页脚保存
    go channel
    goland 注册
    mac安装go环境
    go 结构体与方法
    gin教程
    hihocoder234周 计算不包含黑点的矩形个数
    参考文献的正确姿势
    vscode用法
    使用extract-text-webpack-plugin提取css文件
  • 原文地址:https://www.cnblogs.com/tun117/p/5246539.html
Copyright © 2020-2023  润新知