题解 P1223 【排队接水】
还是犯了和之前数列分段一样的错误,就是没注意到等待时间和接水时间之间的联系,即"第n个人的等待时间=前n-1个人接水时间的总和 (不包含第n个人接水的时间)",知道这个关系后就可以轻而易举的计算出这n个人的平均等待时间,即"n个人的平均等待时间=n个人所需等待时间的总和/n",至此就可以愉快的去撸代码啦
#include <stdio.h>
int main(){
int t[1000][2];
int n;
double sum_time = 0.0,time = 0.0; //n个人所等待时间的总和以及每个人所等待的时间
int i,j,k = 0;
scanf("%d", &n);
for(i = 0; i < n; i++){
scanf("%d", &t[i][0]); //时间
t[i][1] = i+1; //序号
}
for(i = 0; i < n; i++){ //按时间做升序
for(j = 0; j < n-i-1; j++){
if(t[j][0] > t[j+1][0]){
int temp1 = t[j][0];
int temp2 = t[j][1];
t[j][0] = t[j+1][0];
t[j][1] = t[j+1][1];
t[j+1][0] = temp1;
t[j+1][1] = temp2;
}
}
}
for(i = 0; i < n; i++){ //边输出边计算n个人所等待时间的总和
printf("%d ", t[i][1]);
for(j = k; j < i; j++,k++){
time += t[j][0]; //每个人所等待的时间
sum_time += time; //把每个人所等待的时间给加起来就是n个人所等待时间的总和
}
}
printf("\n%.2lf", sum_time/n);
return 0;
}