CSU - 1588 二叉树+贪心


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


#include<cstdio>
#include<cstring>
#include<algorithm>
#define max_n 1010
using 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 1010
using 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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值