CSU

来源:互联网 发布:国内预科 知乎 编辑:程序博客网 时间:2024/04/30 19:07

D - 合并果子

 CSU - 1588 

思路:O(n*nlgn),贪心思想,每次选最小的两者相加,两者的和压入之前的数组中,之后每次选出最小的两个相加类似此操作;


#include<cstdio>#include<cstring>#include<algorithm>#define max_n 1010using namespace std;int a[max_n];int main(){int t,n;scanf("%d",&t);while(t--){scanf("%d",&n);for(int i=0;i<n;i++)scanf("%d",&a[i]);sort(a,a+n);int p=1,ans=0;for(int i=0;i<n-1;i++){a[p]=a[p-1]+a[p];ans+=a[p];sort(a+p,a+n);p++;}printf("%d\n",ans);}return 0;}

思路:O(nlgn),二叉树思想,利用优先队列动态改变树枝大小;


#include<cstdio>#include<cstring>#include<algorithm>#include<queue>#include<stack>#define max_n 1010using namespace std;struct node{int a;bool friend operator <(node x,node y){return x.a>y.a; }}q,q1,q2;int main(){int t,n;scanf("%d",&t);while(t--){priority_queue<node> Q;scanf("%d",&n);for(int i=0;i<n;i++){scanf("%d",&q.a);Q.push(q);}int ans=0,p;for(int i=0;i<n-1;i++){q1=Q.top();Q.pop();q2=Q.top();Q.pop();q.a=q1.a+q2.a;Q.push(q);ans+=q.a;}printf("%d\n",ans);}return 0;}

1 1
原创粉丝点击