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