思路:贪心,其实就是将接水的人按时间从小到大排序,并且注意坑点,这里的排序是稳定排序(稳定排序就是若两数相同,按输入顺序进行排序),STL排序函数stable_sort可实现此功能,参考:稳定排序
但是我这里是直接手写一个插入排序算法实现(因为插入排序是稳定排序)
用一个结构体维护编号
#include<iostream>
#include<cstdio>
using namespace std;
int n;
struct people{
int id;
int time;
};
//插入排序是稳定排序
void paixu(people man[]){
for(int i=1;i<n;i++){
int t1=man[i].id,t2=man[i].time;
int j=i-1;
while(t2<man[j].time&&j>=0){
man[j+1].time=man[j].time;
man[j+1].id=man[j].id;
j--;
}
j++;
man[j].id=t1;
man[j].time=t2;
}
}
int main(){
double sumtime=0,persontime=0;
cin>>n;
people man[1005];
//输入次序
for(int i=0;i<n;i++){
man[i].id=i+1;
cin>>man[i].time;
}
//按时间排序
paixu(man);
//计算等待时间
for(int i=0;i<n;i++){
persontime+=man[i].time;
sumtime+=(persontime-man[i].time)/n;
}
//输出编号
for(int i=0;i<n;i++){
cout<<man[i].id<<" ";
}
//输出平均等待时间
printf("\n%.2f\n",sumtime);
return 0;
}