题意说给一段长度一定的木头,要用n-1刀砍成n段,砍一刀就要花这一刀砍的木头的长度的钱,问如何砍花钱最少
其实就是把这n块木头按赫夫曼树的方法构造,使得总长度最小
另外本题要int64才能过,被坑了一下
#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <queue>
#include <map>
#define inf 0x3f3f3f3f
#define mod 1000000009
using namespace std;
__int64 w[20005],n,i,ans,tmp,p,flag;
int main()
{
while(~scanf("%I64d",&n))
{
memset(w,0,sizeof w);
for(i=0;i<n;i++)
scanf("%I64d",&w[i]);
sort(w,w+i);
ans=0;
while(n>1)
{
tmp=w[0]+w[1];
ans+=tmp;
flag=1;
for(i=2,p=0;i<n;i++)//手动将tmp插入到剩余数组中(貌似直接sort会超时?)
{
if(flag&&tmp<=w[i])
{
flag=0;
w[p++]=tmp;
i--;
}
else w[p++]=w[i];
}
if(flag)//注意啊 如果tmp是最大的 在这要处理
w[p++]=tmp;
n--;
}
printf("%I64d\n",ans);
}
return 0;
}