洛谷 CF597B 题解

题目传送门


我的思路:

这道题就是贪心中的经典区间覆盖问题,先用右端点从小到大排序目的是先进行时间少的订单,然后用贪心算法进行计算:循环判断:

  • 如果当前时间和订单开始时间不重复,接受订单,就让计数器累加,然后把当前时间更新为订单结束时间。
  • 否则拒绝订单,进行下一次循环

最后输出最大接受订单数


代码如下:

#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std; 
struct Node{
	int s;	//订单开始时间 
	int e;	//订单结束时间 
}a[500010];
bool cmp(Node a,Node b){
	return a.e<b.e; 	//右端点从小到大排序 
}
int ans;	//计数器 
int main(){
	int n;
	cin>>n;
	for(int i=1;i<=n;i++)	cin>>a[i].s>>a[i].e; 
	sort(a+1,a+n+1,cmp);
	int now_time=-1;	//时间可以从 0 开始,当前时间要初始化成 -1
	for(int i=1;i<=n;i++){
		if(a[i].s>now_time){	//如果订单开始时间和当前时间不重复,就可以接受订单 
			ans++;	//符合条件就计数器累加 
			now_time=a[i].e;
		} 
	}
	cout<<ans<<endl;	//最后输出可以接受的最大订单数 
	return 0;
}
posted @   Black--Panda  阅读(39)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示