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;
}