切割木板的顺序是自由的,所以每次选择两块最短的板,组合在一起,加入队列,原来两个板出队,直到队列中为空或者只剩下一个板时结束。这里使用优先队列较为方便。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<queue> #define ll __int64 using namespace std; int len[20005]; int main() { //freopen("d:\\test.txt","r",stdin); int n; ll ans=0; cin>>n; priority_queue<int,vector<int>,greater<int> >q;//最小元素在队头 for(int i=0;i<n;i++) { cin>>len[i]; q.push(len[i]); } while(!q.empty()) { int t1=q.top(); q.pop(); if(!q.empty()) { int t2=q.top(); q.pop(); ans+=t1+t2; q.push(t1+t2); } else break; } printf("%I64d\n",ans); return 0; }
时间: 2024-10-12 19:56:15