合并果子(lgP1090)
贪心。
每次取最小的两堆合并,最后即为正确答案。(我也不会证明/wq)
所以说主要问题就是怎么找最小的两堆。
由于中间不断有插入和删除,所以用优先队列。
扯不下去了 直接看代码吧。
#include<bits/stdc++.h>
using namespace std;
priority_queue<int,vector<int>,greater<int> >q;
int n,a[10001];
long long ans;
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
q.push(a[i]);
}
while(q.size()>=2)
{
int x=q.top();q.pop();
int y=q.top();q.pop();
q.push(x+y);
ans+=x+y;
}
cout<<ans;
}
本文来自博客园,作者:樱雪喵,转载请注明原文链接:https://www.cnblogs.com/ying-xue/p/he-bing-guo-zi.html