EOJ——Problem #3214——锯栅栏

来源:互联网 发布:网络灰色项目 编辑:程序博客网 时间:2024/04/28 13:30

锯栅栏

Time limit per test: 1.0 seconds

Memory limit: 256 megabytes

约翰正在修复农场的一段围栏。进过丈量,他需要 N 块木板,第 i 块木板的长度应该是 Li。他订购了一根很长的木料,长度就是这N 块木板的总长度,由于约翰没有锯子,所以他找到了老唐,想让他帮忙锯开木料。

老唐是个生意精,他乐意代劳,但劳动不是无偿的。每开动一次锯子,可以把木料锯成两段,锯出 N 块木板就需要开动 N1 次机器。老唐说,每次开机都要收加工费,加工费用正比于需要锯开的木料长度。比如要把一段长 20 米的木料锯开,就要收 20 元。约翰不得不接受了老唐的要求,但他发现不同的切割次序会产生不同的费用。请帮约翰设计一个锯开木料的方案,使得约翰付出的加工费之和最小。

Input

第一行:单个整数 N1N20000

第二行到第 N+1 行:第 i+1 行有一个整数 Li1Li50000

Output

单个整数:表示约翰付出的最小费用

Examples

Input
3858
Output
34
注意会超int,一开始没有意识到问题,浪费了好多时间

#include<cstdio>#include<iostream>#include<algorithm>#include<functional>#include<queue>#include<vector>using namespace std;int main(){    int n;    cin>>n;    while(cin>>n)    {        priority_queue<long long,vector<long long>,greater<long long> >team;        while(n--)        {            int t;            cin>>t;            team.push(t);        }        long long ans=0;        while(team.size()!=1)        {            long long t=team.top();            team.pop();            t+=team.top();            team.pop();            team.push(t);            ans+=t;        }        cout<<ans<<endl;    }    return 0;}


原创粉丝点击