【洛谷】P1223 排队接水 题解

本文介绍了一种解决P1223排队接水问题的方法,旨在通过合理的排序来降低人们的平均等待时间。文章详细阐述了实现过程,并提供了一段使用C++编写的示例代码。

P1223 排队接水

这道题首先要明确一处细节,一个人的等待时间并不包括他本身为自己打水的时间(即只记录别人打水的总时间)

首先,若使n个人的平均等待时间最小,不难想出,应让用时较短的人先打水,主体思想即此。

​ 所以首先进行预处理,将每人的时间从小到大sort排序。

① 要输出排队顺序,所以用结构体可以方便的表示和进行数据处理:一个变量表示序号,另一个为接水时间

② 输出平均等待时间:因为第一个人等待时间为0,所以从a2开始加,因此总时间s为

​ a2

​ +a2+a3

​ +a2+a3+a4

​ +…

​ +a2+a3+…+an

归纳得

s = a2*(n-1)+a3*(n-2)+…+an*1

ac代码如下:

#include<iostream>
#include<algorithm>
#include<iomanip>
using namespace std;
int n;
double s = 0;
struct aaa {
	int x, y; //序号,时间
}a[1010];
void sum() {
	
}
bool cmp(aaa c, aaa d)
{
	if (c.y != d.y)
		return c.y < d.y;
	return c.x < d.x;
}
int main() {
	cin >> n;
	for (int i = 1; i <= n; i++)
	{
		cin >> a[i].y;
		a[i].x = i;
	}
	sort(a + 1, a + n + 1,cmp);
	//总排队时间
	int ans = n-1;
	for (int j = 1; j <= n-1; j++)
	{
		s += a[j].y * ans;
		--ans;
	}
	for (int i = 1; i <= n; i++)
		cout << a[i].x << " ";
	cout << endl;
	cout << setprecision(2) << fixed << s / n;
	return 0;
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值