贪心策略----4-3 最优合并问题 (30 分)

输入格式:
第一行有 1 个正整数k,表示有 k个待合并序列。 第二行有 k个正整数,表示 k个待合并序列的长度。

输出格式:
输出最多比较次数和最少比较次数。

输入样例:
在这里给出一组输入。例如:

4

5 12 11 2

输出样例:
在这里给出相应的输出。例如:

78 52

一、贪心策略:

最少对应从待合并序列中每次找最小和次小,最多对应从待合并序列中每次找最大和次大,但是要注意每次得到的和需要与剩下待合并序列进行重新排序!!!

二、代码实现

#include<iostream>
#include<algorithm>
using namespace std;
int main(){
	
	int n;
	cin>>n;
	int a[n],b[n];
	for(int i=0;i<n;i++){
		cin>>a[i];
		b[i]=a[i];
	}
	
	sort(a,a+n);
	
	int minSum=0;	// 最小和次数 
	
	for(int i=0;i<n-1;i++){ // 对于n个数,两两合并成一个总共需要(n-1)次
		
		 minSum+=a[i]+a[i+1]-1; // 取最小和次小
		 
		 a[i]=a[i]+a[i+1]; // 更新当前i位置的a值 
		 a[i+1]=0; // 更新当前位置的下一个的a值为0 
		/*
			如 :	4 21 22 23
			更新一次后为 : 25 0 22 23		
		*/ 
		
		sort(a,a+n); // 重新排序
		
		// 如: 0 22 23 25。之后不断这样,直到 i指向(n-2)的位置 
	}
	
	sort(b,b+n); 
	 
	int maxSum=0; // 最大和次数 
	
	for(int i=0;i<n-1;i++){ // 对于n个数,两两合并成一个总共需要(n-1)次
		
		 maxSum+=b[n-1]+b[n-2]-1; // 取最大和次大,(所有的操作都是在最后两个位置上)
		 
		 b[n-1]=b[n-1]+b[n-2]; // 更新最后位置的b值 
		 b[n-2]=0; // 更新倒数第二位置的b值为 0 
		/*
			如 :	4 21 22 23
			更新一次后为 : 4 21 0 45		
		*/ 
		
		sort(b,b+n); // 重新排序
		// 如: 0 4 21 45。之后不断这样操纵 
	}
	
	cout<<maxSum<<" "<<minSum<<endl;
	 
	return 0;
} 
  • 0
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值