首页 > 其他分享 >洛谷P1223 排队接水

洛谷P1223 排队接水

时间:2024-08-05 17:51:38浏览次数:13  
标签:洛谷 int 排队 等待时间 P1223 接水 排序 贪心

P1223 排队接水

题目描述

有 \(n\) 个人在一个水龙头前排队接水,假如每个人接水的时间为 \(T_i\),请编程找出这 \(n\) 个人排队的一种顺序,使得 \(n\) 个人的平均等待时间最小。

输入格式

第一行为一个整数 \(n\)。

第二行 \(n\) 个整数,第 \(i\) 个整数 \(T_i\) 表示第 \(i\) 个人的接水时间 \(T_i\)。

输出格式

输出文件有两行,第一行为一种平均时间最短的排队顺序;第二行为这种排列方案下的平均等待时间(输出结果精确到小数点后两位)。

样例 #1

样例输入 #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

提示

\(1\le n \leq 1000\),\(1\le t_i \leq 10^6\),不保证 \(t_i\) 不重复。

思路:

  • 我们可以采取贪心的策略,将接水时间慢的人放在后面排队,那么后面的人的排队时间就较短,这是我们的直觉告诉我们的结果,并且,这也是贪心策略的局部最优解,我们只需要尽可能的将接水时间长的人排在后面接水,那么其他人等待的时间就会减少,到最终时,总的接水时间就会最少。
  • 那么我们这种的接水策略是否能严格的数学证明呢?其实大部分的时候,我们贪心策略的思想,就是非常正常的常识,只要我们举不出明显的反例来证明我们的策略不可行,我们就可以使用贪心策略,不过这题我们还真的可以来进行严格的数学证明我们这个策略的可行性。

证明策略的可行性

  • 从这里也可以看出,贪心策略往往与排序是一起出现的,每次枚举最优的解法,最终达到最优的结果!

代码:

#include<algorithm>
#include<iostream>
using namespace std;
struct people {
	int t;
	int id;
}a[1005];
//按接水时间来升序排列
bool compare(people& a, people& b) {
	return a.t < b.t;
}
int n;
int main()
{
	cin >> n;
	for (int i = 1; i <= n; i++) {
		cin >> a[i].t;
		a[i].id = i;
	}
	sort(a + 1, a + 1 + n, compare);
	for (int i = 1; i <= n; i++) {
		cout << a[i].id << " ";
	}
	cout << endl;
	double sum = 0;
    //这里为什么要✖(n-i)呢,因为第一个人洗澡的时候,后面n-1个人都要等它,第二个人,后面的n-2个人又要等他
	for (int i = 1; i <= n - 1; i++) sum += a[i].t*(n-i);
	double average = sum / n;
	printf("%.2lf", average);
	return 0;
}

部分代码的解释:

计算sum的部分涉及到如下的代码段:

double sum = 0;
for (int i = 1; i <= n - 1; i++)
    sum += a[i].t * (n - i);

这段代码的目的是计算加权平均数的值,其具体含义是在对人员按照t属性排序后,计算每个人在队列中的等待时间乘以其后面人数的总和。让我们分析一下为什么要乘以(n - i)

  1. 排序的影响

    • 数组 a[] 中的人员按照 t 属性从小到大排序。
    • 排序后,a[i].t 表示第 i 个人的处理时间。
  2. 等待时间的计算

    • 在排序后的顺序中,如果第 i 个人在队列中,那么他前面有 i - 1 个人,因此他的等待时间就是前面所有人的处理时间之和。
  3. 加权求和的原理

    • 对于第 i 个人,他的等待时间为 a[i].t * (n - i)。这里 (n - i) 表示的是他后面的人数,因为他后面的每个人都要等待他的处理时间。
  4. 计算总和

    • sum += a[i].t * (n - i) 就是把每个人的等待时间乘以后面的人数加起来,得到总的加权等待时间之和。
  5. 最终的平均值

    • average = sum / n 就是将这个加权等待时间之和除以总人数 n,得到的是每个人的平均等待时间。

因此,乘以 (n - i) 的操作是为了正确地计算每个人的等待时间对整体加权平均数的贡献,确保了按照题目要求正确计算平均值。

标签:洛谷,int,排队,等待时间,P1223,接水,排序,贪心
From: https://www.cnblogs.com/Tomorrowland/p/18343729

相关文章

  • 洛谷P1001 A+B Problem的一些歪解(淼作)
    一、LCT#include<iostream>#include<cstring>#include<cstdio>#include<cstring>usingnamespacestd;structnode{intdata,rev,sum;node*son[2],*pre;booljudge();boolisroot();voidpushdown();voidupda......
  • 洛谷-P10837 『FLA - I』云音泛
    Abstract传送门这题是线段树+离散化的典型例子。Idea题目要求我们求出在至多只改变一朵花种植时间的情况下,最多有多长的时间是有且只有一朵花开放的。种花可以视为给起始时间到中止时间的区间+1,挖走一朵花,只用在原来的起始时间到中止时间的区间-1,即可,自然的想到用线段树去......
  • 洛谷P10839 【MX-J2-T0】Turtle and Equations题解
    灰常简单!蒟蒻带您写代码!题目理解题目传送门题目描述给你四个正整数。现在你有一条算式。你需要判断能否在两个方框内分别填入三种运算符 之一(运算符可以重复使用),使得算式运算的结果等于。题目分析分析后我们能够发现,只要一一列举出所有能够输出的情况,剩下的输出即可......
  • 洛谷P1842 [USACO05NOV] 奶牛玩杂技
    [USACO05NOV]奶牛玩杂技题目背景FarmerJohn养了\(N\)头牛,她们已经按\(1\simN\)依次编上了号。FJ所不知道的是,他的所有牛都梦想着从农场逃走,去参加马戏团的演出。可奶牛们很快发现她们那笨拙的蹄子根本无法在钢丝或晃动的的秋千上站稳(她们还尝试过把自己装在大炮里发射......
  • 洛谷P4910题解
    题目大意现在穿T次手串,每根手串的长度分别为不同的n,有木和金两种珠子,相邻两颗珠子必须有一个是金。题目思路分析我们现在设穿到第n个珠子时用金的方案数为f[1][n],用木的方案数为f[0][n]如果第n个珠子为金,那么前一颗珠子是什么都可以,因此f[1][n]=f[1][n-1]+f[0][n-1]而如果......
  • [简单] 树上的dfs & bfs_洛谷P5908 猫猫和企鹅
    题目链接https://www.luogu.com.cn/problem/P5908题目大意:\[\begin{align*}&给定n个点构成一颗树每条边val=1\\&求从根节点Root=1开始\quad其它所有点v到Root的距离\mathrm{dis(v,Root)}<=\mathrm{d}的点的数量\\\end{align*}\]思路:1.bfs队列跑一遍记录每个点的......
  • 【LCA 树上两点的距离 判定点是否在某条边中】洛谷P3398 仓鼠找sugar
    题目链接:P3398仓鼠找sugar-洛谷|(luogu.com.cn)题目大意:判定一棵树上的两条边是否相交Tag:[LCA][树上两点间距离的计算][如何判断与点在某条路径上]思路:\[\begin{align}&1.建图\\&2.\text{dfs}然后\计算出每个点的深度和计\text{anc}(i,j)\\&3.根据树上路径......
  • 超好玩洛谷小游戏大全,好玩到停不下来(用洛谷的人都必须要知道,程序猿、OIer必备)
    Game啊你颓废了快点这个<tuifei break>{\color{White}\colorbox{Pink}{<tuifeibreak>}}<tuifei b......
  • 蒙特卡洛模拟(2)————排队问题
    目录一、基础知识补充1.normrnd(MU,SIGMA)2.exprnd(M)3.tic与toc二、问题提出三、模型建立1.引入符号2.引入符号后,我们可以由题目得到一些递推关系,由这个递推关系做出一个循环进行我们的模拟四、第一问代码求解1.字符初始化2.带入模型进行循环3.输出结果五、第二问代码求解一、基......
  • 洛谷 统计天数 + 语句解析 题解
    题目:P1567统计天数P1597语句解析第一道:P1567统计天数题目描述炎热的夏日,KC非常的不爽。他宁可忍受北极的寒冷,也不愿忍受厦门的夏天。最近,他开始研究天气的变化。他希望用研究的结果预测未来的天气。经历千辛万苦,他收集了连续 N(1≤N≤10^6)天的最高气温数据。现在......