题目链接:
题目大意是,把一块长木板割成n快给定长度的木板,每次的花费为当前模板的长度,求最小的花费。逆向求解即可,贪心的思想,每次取两块木板长度最小的,花费为量长度之和,然后把新的长度加进去,操作n-1次,就是一个huffman树的构造过程。然后用优先队列搞之。
1 //STATUS:C++_AC_16MS_348KB 2 #include3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 12 using namespace std;13 #define LL __int6414 #define pii pair 15 #define Max(a,b) ((a)>(b)?(a):(b))16 #define Min(a,b) ((a)<(b)?(a):(b))17 #define mem(a,b) memset(a,b,sizeof(a))18 #define lson l,mid,rt<<119 #define rson mid+1,r,rt<<1|120 const int N=110,INF=0x3f3f3f3f,MOD=1999997;21 const LL LLNF=0x3f3f3f3f3f3f3f3fLL;22 23 int n;24 25 int main()26 {27 // freopen("in.txt","r",stdin);28 int i,a,t;29 LL ans;30 while(~scanf("%d",&n))31 {32 priority_queue ,greater > q;33 ans=0;34 for(i=0;i