题目描述
皮皮在玩新型大鱼吃小鱼游戏,游戏规则是这样的,水池里面一共有n(1<n<1000000)条鱼,每条鱼的体重为s(1<s<10000),游戏进行m(1<= m < n)轮,
每一轮体重最小的鱼都会吃掉体重第二小的鱼,并且最小的鱼体重为两条鱼体重之和,第m轮之后最小的鱼体重是多少?
输入
输入分为两行,第一行为两个数字,分别代表n和m,第二行为n个数字,代表n条鱼的体重
输出
输出为一行一个数字,代表第m轮之后最小的鱼体重(注:在每一轮中如果最小的鱼的体重有多个,可以任意选择一条)
样例输入复制
3 1 1 2 3
样例输出复制
3
自己都没想着这个写法能在c语言网上能ac,数据大了这个代码是过不了全部测试点的。
能水数据的代码:
#include<iostream>
int n,m;
struct fish{
int wei[1000010];
}fis;
using namespace std;
int main()
{
cin>>n>>m;
int x;
for(int i = 0;i<n;i++){
cin>>x;
fis.wei[x]++;
}
int cnt = 0;
int min = 0;
for(int i = 0;i<=1000010;i++)
{
if(fis.wei[i])
{
fis.wei[i]--;
min += i;
cnt++;
if(i>0)i--;
}
if(cnt==2)
{
fis.wei[min]++;
min = 0;
m--;
if(!m)break;
cnt = 0;
continue;
}
}
for(int i = 0;i<=1000010;i++)
{
if(fis.wei[i])
{
cout<<i;
return 0;
}
}
}
正解:优先队列
ac代码:
#include<iostream>
#include<vector>
#include<queue>
typedef long long ll;
using namespace std;
priority_queue <ll,vector<ll>,greater<ll> > q;
ll min(int m){
ll ans=0;
while(m--)
{
ans=q.top();
q.pop();
ans+=q.top();
q.pop();
q.push(ans);
}
return q.top();
}
int main(){
int n,m,p;
cin>>n>>m;
for(int i=0;i<n;i++){
cin>>p;
q.push(p);
}
cout<<min(m);
return 0;
}