洛谷排队P1223接水问题:
题目描述
有 nn 个人在一个水龙头前排队接水,假如每个人接水的时间为 T_iTi,请编程找出这 nn 个人排队的一种顺序,使得 nn 个人的平均等待时间最小。
输入格式
第一行为一个整数 nn。
第二行 nn 个整数,第 ii 个整数 T_iTi 表示第 ii 个人的等待时间 T_iTi。
输出格式
输出文件有两行,第一行为一种平均时间最短的排队顺序;第二行为这种排列方案下的平均等待时间(输出结果精确到小数点后两位)。
解题思路:
排队接水的问题首先要对输入进的等待时间从小到大进行排序,只有等待时间最少的人最先打水,后面的人才会减少总共等待时间。总共等待时间是每个人的等待时间乘以剩下来的人数相加。最后再按照平均时间等于总时间除以人数总数。
#include<iostream>
#include<iomanip>
#include<algorithm>
#define MAXN 1005
using namespace std;
struct line{
int value;
int p;
};
line a[MAXN];
bool cmp(const line &a, const line &b)
{
if(a.value == b.value)//时间相同,先来的先排序
return a.p < b.p;
else
return a.value < b.value;//否则按照花费时间从小到大排序
}
int main()
{
int n;
scanf("%d",&n);
for(int i = 1; i <=n; ++i)
{
scanf("%d",&a[i].value);
a[i].p = i;
}
sort(a+1,a+1+n,cmp);
double sum=0;
for(int i = 1; i <= n; ++i)
{
printf("%d ",a[i].p);
sum += (n-i)*a[i].value;
}
printf("\n");
printf("%.2lf",sum/n);
return 0;
}