当前位置: 首页 > news >正文

算法1-4 凌乱的yyy / 线段覆盖

题目描述

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

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

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

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

输入格式

第一行是一个整数 n,接下来 n 行每行是 2 个整数 ai​,bi​ (ai​<bi​),表示比赛开始、结束的时间。

输出格式

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

输入输出样例

输入 #1

3
0 2
2 4
1 3

输出 #1

2

说明/提示

  • 对于 20% 的数据,n≤10;
  • 对于 50% 的数据,n≤103;
  • 对于 70% 的数据,n≤105;
  • 对于 100% 的数据,1≤n≤106,0≤ai​<bi​≤106。

在一个数轴上有n条线段,现要选取其中k条线段使得这k条线段两两没有重合部分,问最大的k为多少。

最左边的线段放什么最好?

显然放右端点最靠左的线段最好,从左向右放,右端点越小妨碍越少

其他线段放置按右端点排序,贪心放置线段,即能放就放。

 

#include<iostream>
#include<algorithm>
using namespace std;

int n;
int ans=1;
int last_end_time; //上一场比赛结束的时间  C++ 标准库中有个 time 函数,这里不能取time

struct match{
	int begin;  //比赛开始时间 
	int end;  //比赛结束时间 
}m[1000010];

bool cmp(match x, match y)
{
	return x.end < y.end;
}

int main()
{
	cin>>n;
	for(int i=0; i<=n-1; ++i)
	{
		cin>>m[i].begin;
		cin>>m[i].end;
	}
	
	//按照比赛结束的早晚排序 结束的早的放在前 
	sort(m, m+n, cmp);
	//结束最早的那场比赛一定可以参加 
	last_end_time = m[0].end;
	
	//从第二个比赛开始找
	for(int i=1; i<=n-1; ++i)
	{
		//当前比赛的开始时间大于等于上场比赛的结束时间
		if(m[i].begin >= last_end_time)
		{
			ans++;
			last_end_time = m[i].end;
		}
	}
	
	cout<<ans;
	return 0;
}

相关文章:

  • 全星FMEA软件系统在汽车电子行业的应用介绍
  • 2024 JAVA面试题
  • CSS—flex布局、过渡transition属性、2D转换transform属性、3D转换transform属性
  • 2025-03-04 学习记录--C/C++-C语言 判断是否是素数
  • stable-diffusion-webui 加载模型文件
  • sql调优(oracle):优化响应时间(优化sql) / 优化吞吐量; 高斯调优
  • 一、OpenGL的原理解析
  • FreeRTOS 源码结构解析与 STM32 HAL 库移植实践(任务创建、删除篇)
  • Windows 10/11 系统下 Git 的详细安装步骤和基础设置指南
  • Foxglove 介绍以及入门使用教程
  • 【AI深度学习基础】Pandas完全指南终极篇:构建企业级数据工程与AI应用 (含完整代码)
  • Spring40种注解(下)!!
  • 【图像识别做UI自动化第一章】UI自动化代码设计思路
  • 【Go】Go viper 配置模块
  • Golang的微服务服务发现机制
  • 人工智能-Python基础-导学-01
  • scala 中的泛型
  • RocketMQ启动教程
  • C++中的无锁编程
  • 深度学习代码解读——自用
  • wordpress盗版模板/北京百度seo点击器
  • 政府旅游网站建设/站长之家域名查询官网
  • 无毒手机网站/网络推广项目
  • 快速知彼网络网站建设/怎么开发自己的小程序
  • 3d云打印网站开发/百度今日数据统计
  • 下载微信公众号平台官网/广州市口碑seo推广