题意:
思路:
可以把所有的次幂看成进制数,然后可以用二进制模拟一下,比如
2^3= 2^2+ 2^2 , 2^4 = 2^3 + 2^3 以此推下去,所以我要求一个最大值的最小值能够买下所有东西,就是他们所有的和都要小于这个数,那么我只需要找到一个最高次幂即可,当然这题没有那么简单,他要找的数是比所有数的和还要大的
那么如何求和呢?看到数的大小很明显无法求和,只能用进制的关系也就是上面推的公式,只要某个幂次出现的次数大于a,即可转换成当前幂次+1,就完成了进位也完成了求和
最后注意还有两个坑点,如果最高次幂只有他本身,那么就直接输出最高次幂即可,但如果最高次幂出现的次数大于一次或者有比他小的幂次出现过,那么就得输出最高次幂+1了
#include<algorithm> #include<iostream> #include<vector> #include<map> using namespace std; const int maxn=55; int b[maxn]; int main() { int n,i,j,a,k; cin>>n>>a; map<int,int >mo; for(i=0; i<n; i++) { cin>>b[i]; mo[b[i]]++; } while(1) { int f1=0; for(auto it=mo.begin(); it!=mo.end(); ++it) { if(it->second>=a) { int x=it->second/a; it->second-=x*a; int y=it->first+1; mo[y]+=x; f1=1; } } if(f1==0) break; } int max1=0,flag=0; for(auto it=mo.begin(); it!=mo.end(); ++it) { if(it->second!=0) max1=max(it->first,max1); //cout<<it->first<<" "<<it->second<<endl; } for(auto it=mo.begin(); it!=mo.end(); ++it) { if(it->second!=0&&it->first!=max1) flag=1; if(it->second>1&&it->first==max1) flag=1; } cout<<max1+flag<<endl; return 0; } /* 3 10 1 1 1 1 */