哈夫曼型的贪心
#include<iostream>
#include<algorithm>
#include<queue>
#include<stdio.h>
using namespace std;
int plank[20005];
priority_queue< long long,vector<long long>,greater<long long> > q;
int main()
{
int N;
while(scanf("%d",&N)==1)
{
while(!q.empty())
q.pop();
for(int i=0;i<N;i++)
scanf("%d",&plank[i]);
sort(plank,plank+N);
int j=0;
int temp1=0,temp2=0;
long long sum=0;
while(1)
{//printf("%d/n",sum);
if(j>=N&&q.size()==1)
break;
else
{
if(j>=N)
{
temp1=q.top();
q.pop();
temp2=q.top();
q.pop();
q.push(temp1+temp2);
sum+=(temp1+temp2);
}
else if(q.empty())
{
temp1=plank[j++];
temp2=plank[j++];
q.push(temp1+temp2);
sum+=(temp1+temp2);
}
else
{
int temp3=q.top();
if(plank[j]<=temp3)
temp1=plank[j++];
else
{
temp1=q.top();
q.pop();
}
if(q.empty())
temp2=plank[j++];
else if(j>=N)
{
temp2=q.top();
q.pop();
}
else
{
temp3=q.top();
if(plank[j]<=temp3)
temp2=plank[j++];
else
{
temp2=q.top();
q.pop();
}
}
q.push(temp1+temp2);
sum+=(temp1+temp2);
}
}
}
printf("%I64d/n",sum);
}
return 0;
}
#include <iostream>
#include<stdio.h>
#include<algorithm>
using namespace std;
int plank[20005];
int main()
{
int N;
while(scanf("%d",&N)==1)
{
int leavelength=0;
int sumcost=0;
for(int i=0;i<N;i++)
{
scanf("%d",&plank[i]);
leavelength+=plank[i];
}
//从大到小直接减去求和的错误在于我不一定每次锯木后都得到plank中的值,
//可以先得到中间结果可能更节省钱
sort(plank,plank+N);
sumcost=leavelength;
for(int i=N-1;i>=2;i--)
{
sumcost+=(leavelength-plank[i]);
}
printf("%d/n",sumcost);
}
return 0;
}