首页 > 其他分享 >20241217每日一题洛谷P1803

20241217每日一题洛谷P1803

时间:2024-12-17 21:43:48浏览次数:3  
标签:le 洛谷 int ed 线段 game 20241217 cmp P1803

普及-每日一题洛谷P1683

题目描述

现在各大 oj 上有 \(n\) 个比赛,每个比赛的开始、结束的时间点是知道的。

yyy 认为,参加越多的比赛,noip 就能考的越好(假的)。

所以,他想知道他最多能参加几个比赛。

由于 yyy 是蒟蒻,如果要参加一个比赛必须善始善终,而且不能同时参加 \(2\) 个及以上的比赛。

输入格式

第一行是一个整数 \(n\),接下来 \(n\) 行每行是 \(2\) 个整数 \(a_{i},b_{i}\ (a_{i}<b_{i})\),表示比赛开始、结束的时间。

输出格式

一个整数最多参加的比赛数目。

样例输入

3
0 2
2 4
1 3

样例输出

2

提示

  • 对于 \(20\%\) 的数据,\(n \le 10\);
  • 对于 \(50\%\) 的数据,\(n \le 10^3\);
  • 对于 \(70\%\) 的数据,\(n \le 10^{5}\);
  • 对于 \(100\%\) 的数据,\(1\le n \le 10^{6}\),\(0 \le a_{i} < b_{i} \le 10^6\)。

题目可以转化为求在一条数轴上,不相互覆盖的线段的最大数量

输入线段的长度,可以基于贪心的想法,把每个右端点的线段优先考虑,这是因为每次选取结束时间最靠前的比赛是当前的最优解

线段覆盖问题取每一次的最优解可以得到全局的最优解

首先将线段的参数读入:

struct game
{
	int st, ed;
};
game a[100010];//定义结构体

for (int i = 0; i < n; i++) cin >> a[i].st >> a[i].ed;//存入左右端点

然后可以按照ed从小到大排序,这里使用sort函数,配置cmp实现

bool cmp(game x, game y) {
	return x.ed < y.ed;
}
sort(a, a + n, cmp);

然后遍历全部的线段,每次取最优解(从\(0\)开始)

int r = 0;//定义当前位置
for (int i = 0; i < n; i++) {
	if (r <= a[i].st) {//当前位置小于当前线段的左端点,可以放入
		ans++;//答案++
		r = a[i].ed;//更新当前位置
	}
}

完整AC代码:

#include <iostream>
#include <algorithm>
#include <cstring>
#define streampreset() ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);//自定义关闭同步流
using namespace std;

struct game
{
	int st, ed;
};
game a[100010];

bool cmp(game x, game y) {
	return x.ed < y.ed;
}

int main()
{
	streampreset();//读入数据较大,关闭同步流加速读入
	int n, ans = 0;
	cin >> n;
	for (int i = 0; i < n; i++) cin >> a[i].st >> a[i].ed;
	sort(a, a + n, cmp);
	int r = 0;
	for (int i = 0; i < n; i++) {
		if (r <= a[i].st) {
			ans++;
			r = a[i].ed;
		}
	}
	cout << ans;
	return 0;
}

标签:le,洛谷,int,ed,线段,game,20241217,cmp,P1803
From: https://www.cnblogs.com/dianman/p/18613460

相关文章

  • 20241217-封装、继承、多态
    1.封装目的在于保护数据安全,隐藏细节。1.1属性的封装//本文属性和方法都定义为静态的,也可不设为静态,由创建对象来调用和访问。publicclassTestCat{ publicstaticvoidmain(String[]args) { Cat.setWeight(2.3f); }}classCat{ privatestaticfloatweigh......
  • 洛谷P7911 [CSP-J 2021] 网络连接题解
    普通的模拟题,数据很小,基本排除超时超空间的可能上代码:#include<bits/stdc++.h>#defineLLlonglongusingnamespacestd;vector<pair<int,string>>sv;//用于存储Server,sv[i].first代表Server编号,sv[i].second代表Server地址intturn(stringstr){//string转int if(str.......
  • 洛谷P3389 【模板】高斯消元法 高斯消元模板题
    题目链接:https://www.luogu.com.cn/problem/P3389题目大意:略解题思路:略(因为是模板题)示例程序:#include<bits/stdc++.h>usingnamespacestd;constintmaxn=110;constdoubleeps=1e-7;intn;doublea[maxn][maxn];boolgauss(){for(inti=1;i<=n;i++......
  • 洛谷B2061 整数的个数 解析
    题目描述给定 k(1<k<100)个正整数,其中每个数都是大于等于 1,小于等于 10 的数。写程序计算给定的 k 个正整数中,1,5和 10出现的次数。输入格式输入有两行:第一行包含一个正整数 k,第二行包含k 个正整数,每两个正整数用一个空格分开。输出格式输出有三行,第一行为 1 ......
  • 洛谷 3625(B) 迷宫寻路
    洛谷3625(B)迷宫寻路DFS版思路典型的地图DFS实现方法当前位置是\((x,y)\)如果已经到达终点,直接输出Yes。如果没到,就向上下左右四个方向分别走一次,然后又执行一次上述操作。代码#include<cstdio>#include<iostream>#include<cstdlib>usingnamespacestd;......
  • 洛谷题单指南-线段树-P4145 上帝造题的七分钟 2 / 花神游历各国
    原题链接:https://www.luogu.com.cn/problem/P4145题意解读:对于序列a[n],支持两种操作:1.对区间[l,r]内每个数开方2.查询区间[l,r]每个数的和解题思路:区间修改,区间查询,可以用线段树解决。咋一看,需要借助于懒标记来修改节点,但仔细分析,开方操作并不具备可累加性,并且也不能通过开方......
  • Edge浏览器使用洛谷账号远程提交配置说明
    首先,我们需要打开Edge浏览器并登录洛谷并且确保你已经登录了洛谷的账号,像这样:然后按F12按钮打开Edge的开发人员工具(可能会问你是否打开开发人员工具,选择“是”)在开发工具中找到“应用程序”,如下(我这里是点击了“+”号,然后再找到“应用程序”的):点击应用程序后,展开......
  • 洛谷题单指南-线段树-P5522 [yLOI2019] 棠梨煎雪
    原题链接:https://www.luogu.com.cn/problem/P5522题意解读:有若干0/1/?组成的字符串,支持两种操作:1.将制定位置字符串修改成新字符串;2.查询区间内字符串能否统一成一个字符串,求有多少种可能;将2的所有结果异或起来,再和0异或,输出最终答案。注意:?表示可以用0或1取代。解题思路:单点修......
  • 【洛谷】P1217 [USACO1.5] 回文质数(AC详解)
    #include<iostream>//引入输入输出流头文件,用于实现标准输入输出操作,例如使用cin和cout#include<cmath>//引入数学函数库头文件,主要用于调用sqrt函数来求平方根,辅助判断质数usingnamespacestd;//函数声明,用于判断一个整数是否为质数,接收一个整数参数,返回布尔值......
  • 洛谷B2082
    数字统计-洛谷数字统计题目描述请统计某个给定范围[L,R] 的所有整数中,数字2 出现的次数。比如给定范围[2,22],数字2 在数2 中出现了1 次,在数12 中出现1 次,在数20中出现1次,在数21 中出现1 次,在数22 中出现2次,所以数字2 在该范围内一共出现了6 ......