本文主要是介绍2021浙江工业大学程序设计迎新赛决赛(重现赛)----MS 与美食街 2,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
飞机票
题意:
思路:
可以把所有的次幂看成进制数,然后可以用二进制模拟一下,比如
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*/
这篇关于2021浙江工业大学程序设计迎新赛决赛(重现赛)----MS 与美食街 2的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!