题目描述
有n个人在一个水龙头前排队接水,假如每个人接水的时间为Ti,请编程找出这n个人排队的一种顺序,使得n个人的平均等待时间最小。
输入输出格式
输入格式:输入文件共两行,第一行为n;第二行分别表示第1个人到第n个人每人的接水时间T1,T2,…,Tn,每个数据之间有1个空格。
输出文件有两行,第一行为一种排队顺序,即1到n的一种排列;第二行为这种排列方案下的平均等待时间(输出结果精确到小数点后两位)。
--
思路
排序+贪心。
首先我们要排的是所有的元素,但是为什么是从小到大呢???
由于若把时间长的放在后面接水,那么就较少人等,所以排序+贪心即可。
对于每一个人,在场剩余每个人都要经历一次他的打水时间。
故遍历整个数组求其他人在这个人打水时花费的总时间累加到变量sum上,最后sum除以n(算平均值)。
注意:
1.数据规模 要用long long 或double;
2.数据形式转换,整型除以整型是要取整的
#include <stdio.h> #include <iostream> #include <algorithm> int main() { int n; long long a[1001]={},b[1001]={}; scanf("%d",&n); int i,j; double sum=0; for(i=1;i<=n;i++) { scanf("%lld",&a[i]);//a数组记录时间 b[i]=i;//b数组记录编号 } int t;//临时变量t for(i=1;i<=n-1;i++) for(j=1;j<=n-i;j++) {//冒泡排序 if(a[j]>a[j+1])//如果前一个人的时间比后一个人的时间长 { t=a[j];a[j]=a[j+1];a[j+1]=t;//交换 t=b[j];b[j]=b[j+1];b[j+1]=t;//同理 }//也可以使用iostream中的swap }//也可以使用algorithm的sort double num=0; for(i=1;i<=n;i++) { num=0; for(j=i-1;j>=1;j--) { num+=a[j];//累加等待时间 } //printf("%d ",num);//累加等待时间 sum = sum+num; } for(i=1;i<=n;i++) { printf("%lld ",b[i]);//先输出编号 } printf("\n%.2f",sum/n);//平均值 return 0; }