PAT 1125 Chain the Ropes (25 分)贪心算法 结果向下取整(题目有歧义) 燚

Given some segments of rope, you are supposed to chain them into one rope. Each time you may only fold two segments into loops and chain them into one piece, as shown by the figure. The resulting chain will be treated as another segment of rope and can be folded again. After each chaining, the lengths of the original two segments will be halved.

rope.jpg

Your job is to make the longest possible rope out of N given segments.

Input Specification:

Each input file contains one test case. For each case, the first line gives a positive integer N (2≤N≤10​4​​). Then N positive integer lengths of the segments are given in the next line, separated by spaces. All the integers are no more than 10​4​​.

Output Specification:

For each case, print in a line the length of the longest possible rope that can be made by the given segments. The result must be rounded to the nearest integer that is no greater than the maximum length.

Sample Input:

8
10 15 12 3 4 13 1 15

Sample Output:

14

题目大意: 第一行给出绳子的个数N。

                   第二行  :给出N个绳子的长度

                  题目要求:将任意两根绳子接在一起合并为一根绳,长度为原来两根绳子总长的一半,求出N根绳子合并后的最大长度,输出要求:最大长度不能超过原绳子的最长的那根,如果结果result不为整数,则取与result最接近的整数。

思路:1.由于两根绳子a,b合并后的长度一定在原绳子长度[a,b]区间之内,因此如果不断的和更长的绳子合并,那么结果也会变得越来越大,

           2.根据以上思想,可以用贪心算法,每次选出最短的两根绳子,合并之后放入原绳子队列,然后一直循环直至最后合并为一根绳子,即为所求长度。

 坑点:如果按照题目要求,对结果四舍五入,则最后一个测试样例无法通过。向下取整则能AC

#include<iostream>
#include<queue>
using namespace std;
int main() {
	int n;
	priority_queue<double, vector<double>, greater<double>>q; //创建一个由小到大的优先队列
	cin >> n;
	double max = 0;
	for (int i = 0; i < n; i++) {
		double temp;
		scanf("%lf", &temp);
		q.push(temp);
		if (max < temp)
			max = temp; //选出最长的那根绳子
	}
	//合并绳子
	while (q.size() > 1) {
		double temp1 = q.top();
		q.pop();
		double temp2 = q.top();
		q.pop();
		double temp = (temp1 + temp2) / 2;
		q.push(temp);
	}
	double result = q.top();
	//输出结果
	if (result >= max) {
		printf("%.0lf", max);
	}
	else {
		int temp = int(result);
		printf("%d", temp);
	}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值