P1090 合并果子 / [USACO06NOV] Fence Repair G
蒟蒻的第一篇题解
我终于也能发题解啦【激动ing】
这道题我这个蒟蒻第一个想到的就是用堆来做()毕竟是新学的 。。。
经过一点点分析之后可以知道 我们要做的实质上是个大根堆,因为我们要尽可能少的合并果子数量多的果堆,因为那样会消耗很多体力,所以…
代码如下:
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int a[100010];
int ans; //存储最后的总力气值
int main()
{
int n; //n堆果子
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
sort(a+1,a+n+1); //初始排序(方便后面进行操作)
for(int i=1;i!=0;i++) //相当于while(1),死循环
{
int j=1;
while(a[j]==0)
j++;
if(j==n) break; //此时只有1个堆,不需要进行后面的操作,直接在后面输出即可
else
{
a[j]+=a[j+1];
ans+=a[j]; //合并果堆,增加力气值
for(int k=j+1;k<n;k++)
a[k]=a[k+1]; //把后面的果堆向前移
n--; //合并后的果堆减少1
}
for(int k=j;k<n;k++)
{
if(a[k]>a[k+1]) //交换,移动一些元素在堆中的位置
swap(a[k],a[k+1]);
}
}
printf("%d",ans); //输出总力气值(√)
return 0;
}
就这样吧,抱代码随意,但我觉得好像也没人愿意抱这么蒟蒻的代码。。。
ps:一定不要发在洛谷讨论区,我一开始不知道,发在那里被人警告了【哭哭】,我一开始还以为会被别人表扬呢