1070 结绳 (25 分)(测试点1)

230 阅读1分钟

1070 结绳 (25 分)

题目链接

算法分析

从第一根最短的绳子开始折起来,折到最长的绳子损失就最小。(贪心算法)

测试点

我这个题卡在了测试点一
在这里插入图片描述
然后我就去上网察看各路代码,再对照我的代码后发现,原来的算法就是错的,真不知道怎么对了另外四个测试点 ,问题就出在这里:

double sum = 0;
for(int i = 1; i <= n; ++ i)
sum = (sum + x[i]) / 2.0;

折第一根绳子就要对折?很明显是不对的
所以稍作修改,从第二根才开始对折

double sum = x[1];
for(int i = 2; i <= n; ++ i)
sum = (sum + x[i]) / 2.0;

这样就可以保证正确性了!
在这里插入图片描述

代码实现

#include<bits/stdc++.h>
using namespace std;
#define N 10005
double x[N];
int main(){
	int n;
	scanf("%d", &n);
	for(int i = 1; i <= n; ++ i)
		scanf("%lf", &x[i]);
	sort(x + 1, x + n + 1);
	double sum = x[1];
	for(int i = 2; i <= n; ++ i)
		sum = (sum + x[i]) / 2.0;
	printf("%d", (int)sum);
	return 0;
}