题目描述
有n个人在一个水龙头前排队接水,假如每个人接水的时间为Ti,请编程找出这n个人排队的一种顺序,使得n个人的平均等待时间最小。
输入格式
输入文件共两行,第一行为n;第二行分别表示第1个人到第n个人每人的接水时间1,2,…,T1,T2,…,Tn,每个数据之间有1个空格
输出格式
输出文件有两行,第一行为一种排队顺序,即1到n的一种排列;第二行为这种排列方案下的平均等待时间(输出结果精确到小数点后两位)。
样例输入/输出
输入数据 1
10
56 12 1 99 1000 234 33 55 99 812
输出数据 1
3 2 7 8 1 4 9 6 10 5
291.90
数据约定
n≤1000,ti≤106,不保证ti 不重复。
当ti重复时,按照输入顺序即可(sort 是可以的)
题解!!!!!!
AC代码
#include<bits/stdc++.h>
using namespace std;
long long a,s;
double ans;
struct cou{
long long snd,wq,we;
}e[1000000+250];
bool cmp(cou a,cou b)
{
return a.we<b.we;
}
int main()
{
cin>>a;
s=a-1;
for(int i=1;i<=a;i++)
{
cin>>e[i].we;
e[i].snd=i;
}
sort(e+1,e+a+1,cmp);
for(int i=1;i<=a;i++)
{
cout<<e[i].snd<<" ";
ans+=s*e[i].we;
s--;
}
cout<<endl;
printf("%.2lf",ans/a);
return 0;
}
代码解释
给定n个人的接水时间,需要排队接水。要求编写程序找到一个排队顺序,使得n个人的平均等待时间最小。
首先,读入n和每个人的接水时间。
接下来,创建一个结构体数组e,每个结构体包含三个成员变量:编号snd、接水时间we和等待时间wq。
将每个人的接水时间和编号存入结构体数组,并按照接水时间进行排序。
创建一个变量ans来记录总的等待时间,初始值设置为0,并创建一个变量s来记录剩余人数,初始值设置为n-1。
进行循环遍历,从1到n,输出每个人的编号,并更新总的等待时间ans和剩余人数s。
最后,输出排队方式和平均等待时间(ans除以n)。