0
点赞
收藏
分享

微信扫一扫

寒假算法题打卡:

蓝哆啦呀 2022-01-21 阅读 83

洛谷排队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; 
} 
举报

相关推荐

寒假打卡总结

寒假学习打卡

【寒假算法题练习】1.8

0 条评论