首页 > 其他分享 >20241022每日一题洛谷P1223

20241022每日一题洛谷P1223

时间:2024-10-22 20:33:09浏览次数:1  
标签:排序 peop int 参数 P1223 time 洛谷 20241022 cmp

普及 洛谷 P1223 接水问题

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

第一行为一个整数 n, 第二行 n个整数,第 i个整数 Ti表示第 i个人的接水时间 Ti

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

不同于贪心的模板接水问题,我们需要输出排队的顺序

使用结构体把排队时间和顺序进行绑定可以有效的解决问题

struct peop
{
	int time;
	int num;
};

peop a[1010];

在主函数中,我们依次读入 a数组 的 timenum

按照贪心的想法,每次选取用时最短的人来接水

所以需要对 a数组中的 time 进行从小到大的排序

问题来了,单纯按照 time 进行排序后 num 的顺序会对应不上 time

这是因为结构体中的元素不能进行整体的排序

我们需要一种方法来使得结构体按照它的某一个元素的大小,来对结构体整体进行排序

这就引入了 sort 函数的 cmp 参数

sort(first_pointer,first_pointer+n,cmp);

通过cmp参数实现结构体的排序:

cmp 比较函数需要接受两个参数并返回一个bool值,如果第一个参数应该排在前面,就返回 true;否则返回 false

例:配置 cmp 进行降序排序

bool cmp(int a, int b) {
    return a > b; // 降序排序
}

下面来逐步解释这一函数:

传入cmp函数的两个参数为 a 和 b ,我们想让大的数排在前面

返回为 ture 时,表示 a 这个参数应该排在前面,显然符合 a > b的逻辑

返回为 false 时,表示 a 这个参数应该排在后面,a > b不成立,符合逻辑

关于这道题,我们需要配置一个cmp函数使得结构体根据结构体中的一个元素进行排序

有:

bool cmp(peop x, peop y) {
    return x.time < y.time;//按照time大小进行升序
}

传入cmp函数的两个参数为 结构体x 和 结构体y ,我们想让time最小的结构体排在前面

当第一个参数的time小于第二个参数的time时,返回ture,即把第一个参数放在前面

在配置好适用于这道题的cmp函数后

通过:

sort(a,a+n,cmp);

就可以peop进行整体排序

补充:lambda表达式

Lambda 表达式是一种简洁的方式来定义一个匿名函数

语法如下:

[capture](parameters) -> return_type {// function body}
/*
capture:用于捕获外部变量,可以是值捕获或引用捕获
parameters:参数列表,可以省略参数的类型
return_type:返回的类型,如果可以推断则可以省略
function body:函数体,包含要执行的代码
*/

关于这道题的cmp配置,我们可以简单的使用lambda表达式填入:

sort(a+1, a + n+1, [](peop i, peop j) {return i.time < j.time; });

相当于:

bool cmp(peop i, peop j) {
    return i.time < j.time;//按照time大小进行升序
}

关于lambda表达式的推广运用,先挖个坑以后再来填

这道题完整代码如下:

struct peop
{
	int time;
	int num;
};

peop a[1010];
int b[1010],n;
double sum;

int main()
{
	scanf("%d", &n);
	for (int i = 1; i <= n; i++) {
		scanf("%d", &a[i].time);
		a[i].num = i;
	}
	sort(a+1, a + n+1, [](peop i, peop j) {return i.time < j.time; });
	for (int i = 1; i <= n; i++) {
		printf("%d ", a[i].num);
		b[i] = b[i - 1] + a[i].time;
		if (i<n) sum += b[i];
	}
	printf("\n%.2lf", sum / n * 1.0);
	return 0;
}

标签:排序,peop,int,参数,P1223,time,洛谷,20241022,cmp
From: https://www.cnblogs.com/dianman/p/18493679

相关文章

  • 洛谷P3850 [TJOI2007] 书架 splay tree 模板题
    题目链接:https://www.luogu.com.cn/problem/P3850主要操作就是:插入+查询第k值。示例程序:#include<bits/stdc++.h>usingnamespacestd;constintmaxn=1.1e5+5,maxb=20;structNode{ints[2],p,sz;stringname;Node(){}Node(string_n......
  • 洛谷P2596 [ZJOI2006] 书架 题解 splay tree 模板题
    题目链接:https://www.luogu.com.cn/problem/P2596主要涉及的操作就是:找到某一个编号的点(这个操作可以不用splaytree维护)删除某个点将某一个点插入到最前面,最后面,或者某一个位置查询前序遍历为\(k\)的节点编号因为每次删除都会又把这个点加回去,所以可以复用\(n\)个......
  • 洛谷管理员语录(不完整)
    ......
  • P10724 [GESP202406 七级] 区间乘积,洛谷id:sxshm
    题解一、分析看看标签:数论,再看题目:完全平方。这不是质因数分解的标配吗?继续看数据范围:1≤ai......
  • 洛谷 P1197 [JSOI2008] 星球大战 做题记录
    我不会做摧毁,于是反着做,就变成了合并连通块,倒序加边即可,时间复杂度\(O((n+m)\alpha(n))\)。(大抵是吧点击查看代码#include<bits/stdc++.h>#definemem(aqwqawa,bqwqawa)memset((aqwqawa),(bqwqawa),sizeof(aqwqawa))#definem0(aqwqawa)memset((aqwqawa),0,sizeof(aqwqaw......
  • 洛谷题单指南-字符串-P4735 最大异或和
    原题链接:https://www.luogu.com.cn/problem/P4735题意解读:已知长度为n的数组a[],要在l~r范围找到一个p,使得a[p]^a[p+1]^...^a[n]^x最大,求这个最大的异或值。解题思路:1、利用前缀和将问题转化设s[]是a[]的前缀异或数组,要计算a中一段范围l~r的异或,可以借助于s由于s[r]=a[0]^a[......
  • 【洛谷 P1116】车厢重组 题解(模拟+冒泡排序)
    车厢重组题目描述在一个旧式的火车站旁边有一座桥,其桥面可以绕河中心的桥墩水平旋转。一个车站的职工发现桥的长度最多能容纳两节车厢,如果将桥旋转度,则可以把相邻两节车厢的位置交换,用这种方法可以重新排列车厢的顺序。于是他就负责用这座桥将进站的车厢按车厢号从小到大排列。他......
  • 【洛谷 P1116】车厢重组 题解(模拟+冒泡排序)
    车厢重组题目描述在一个旧式的火车站旁边有一座桥,其桥面可以绕河中心的桥墩水平旋转。一个车站的职工发现桥的长度最多能容纳两节车厢,如果将桥旋转度,则可以把相邻两节车厢的位置交换,用这种方法可以重新排列车厢的顺序。于是他就负责用这座桥将进站的车厢按车厢号从小到大排列。他......
  • 洛谷P3741 小果的键盘(Python)
    海阔凭鱼跃,天高任鸟飞。——宋·阮阅《诗话总龟前集》一、题目传送门https://www.luogu.com.cn/problem/P3741二、代码input()s=list(input().strip())ans="".join(s).count("VK")foriinrange(len(s)):ifs[i]=='V':s[i]='K'......
  • 洛谷P5731 【深基5.习6】蛇形方阵(Python)
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档前言尝试一种没写过的解法。一、题目传送门https://www.luogu.com.cn/problem/P5731二、代码deffuc(i,j,cur,sign):#位置为(i,j),写下cur,方向为signglobaln,ansifcur>n*n:retur......