题意:
一堆人用方块盖塔,有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)]; }