贪心思路:参考挑战书
简单说就是最小的两个木板应该是同一个大木板切出来的,以此类推,我用的是优先队列,感觉比书上的简单好理解。
#include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #include<string> #include<vector> #include<stack> #include<bitset> #include<cstdlib> #include<cmath> #include<set> #include<list> #include<deque> #include<map> #include<queue> using namespace std; #define inf 0x3f3f3f3f #define ll long long #define fo freopen("in.txt","r",stdin) #define fc fclose(stdin) #define fu0(i,n) for(i=0;i<n;i++) #define fu1(i,n) for(i=1;i<=n;i++) #define fd0(i,n) for(i=n-1;i>=0;i--) #define fd1(i,n) for(i=n;i>0;i--) #define mst(a,b) memset(a,b,sizeof(a)) #define sd(n) scanf("%d",&n) #define sdd(n,m) scanf("%d %d",&n,&m) #define ss(s) scanf("%s",s) #define sddd(n,m,k) scanf("%d %d %d",&n,&m,&k) #define pans(ans) printf("%d\n",ans) #define all(a) a.begin(),a.end() #define sc(c) scanf("%c",&c) const int maxn=200005; const double eps=1e-8; const double PI = acos(-1.0); int main() { int n,i; while(cin>>n) { int l[20005]; priority_queue <int,vector<int>,greater<int> > pq; fu0(i,n) { sd(l[i]); pq.push(l[i]); } ll ans=0; while(n>1)//最后合并为1个木块 { int tp=pq.top(); pq.pop(); int tpp=pq.top(); pq.pop(); int t=tp+tpp;//合并 ans+=t; pq.push(t); n--; } cout<<ans<<endl; } return 0; }