有n个人在一个水龙头前排队接水,假如每个人接水的时间为Ti,请编程找出这n个人排队的一种顺序,使得n个人的平均等待时间最小。
输入格式:
输入文件共两行,第一行为n;
第二行分别表示第1个人到第n个人每人的接水时间T1,T2,…,Tn,每个数据之间有1个空格。
输出格式:
输出文件有两行,第一行为一种排队顺序,即1到n的一种排列;
第二行为这种排列方案下的平均等待时间(输出结果精确到小数点后两位)。
emm...思路很简单,我来讲一下我的思路,就是用结构体排序,按所用时间的从小到大排序,因为我们想一下,让用时短的人先去接水,大家等的时间就会大大缩小。
还有想强调的一个点是,整体的等待时间是(n-i)*n[i].时间,就比如我举个例子,有三个人在等待接水,1,用时2min;2,用时5min;3,用时7min;
那么第一个人不用等待,剩下的2个人需等待2min,第二个人接水时,剩下的1个人需等待5min
还有我用的是sort()排序,真的超简单,作为过来人,我极力推荐大家学会用sort()排序!!!
这个sort()排序知识点很简单,加一个头文件#include"algorithm",后面再加一行using namespace std;下面再写上排序规则就可以了(因为排序规则不唯一,所以没办法在这里写出来,只能就题论题)
好了,上代码^o^
#include"stdio.h"
#include"algorithm"
using namespace std;
struct node
{
int x,xuhao;//x代表的是时间
};
struct node n[1010];
bool cmp(node a,node b)//本题的排序规则,是按时间从小到大排序的
{
return a.x<b.x;
}
int main()
{
int t;
double sum=0,k;
scanf("%d",&t);
for(int i=1;i<=t;i++)
{
scanf("%d",&n[i].x);
n[i].xuhao=i;
}
sort(n+1,n+1+t,cmp);
for(int i=1;i<=t;i++)
{
k=(t-i)*n[i].x;//每个人接水时其他人的等待时间
sum+=k;//累加呗
}
for(int i=1;i<=t;i++)
printf("%d ",n[i].xuhao);
printf("\n");
printf("%.2f",sum*1.0/t);
return 0;
}