zoukankan      html  css  js  c++  java
  • 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)];
    }
  • 相关阅读:
    Oracle存储过程小记DUAL
    线程私有数据(TSD)
    Unix 五种基本I/O模型的区别
    Redis系列(0)应用场景
    linux ubuntu引导 win7
    Redis系列(一)启动流程分析
    c++ 内存管理小结
    设计模式Facade模式应用场景
    学会理财不做穷人
    jquery 注册验证例子
  • 原文地址:https://www.cnblogs.com/tun117/p/5246539.html
Copyright © 2011-2022 走看看