2071 不相交子区间(贪心)

给定一定数量的线段,目标是通过移除最少线段使得剩余线段两两间无内部公共点。本文介绍了尝试通过排序和二分查找优化的方法,最终提出贪心策略,每次都选择结束时间最早的线段,以此简化问题。虽然缺乏严格证明,但贪心方法直觉上可行,并可能有效减少线段数量。
摘要由CSDN通过智能技术生成

给定 x 轴上 N(0<N<100)条线段 [ai,bi] i=1,2,……N,端点坐标都是区间(-999,999)内的整数。
请你编写一个程序,从给出的线段中去掉尽量少的线段,使得剩下的线段两两之间没有内部公共点。
所谓的内部公共点是指一个点同时属于两条线段且至少在其中一条线段的内部(即除去端点的部分)。

输入
输入第一行是一个正整数 N,表示线段个数。
接下来有 N 行,第 i 行有两个空格隔开的整数,表示第 i 条线段两个端点的坐标。
输出
输出一个数,表示最多剩下的线段数。
输入样例
3
6 3
1 3
2 5
输出样例
2
一开始的思路是先将线段排好序,从左往右找起。因为当前位置的一条线段有两种可能,一个是与下一条线段没有重叠,那就可以数量直接加1;还有一种是有重叠,这个又可以分为两种情况,一种是舍弃当前这一条,从下一条开始考虑起,一种是不舍弃,往后找到不重叠的那条开始接着考虑。但是超时了,代码如下:

#include<bits/stdc++.h>
using namespace std;
struct node{
	int x,y;
}line[110];
int cmp(node a,node b)
{
	if(a.x==b.x) return a.y>b.y;
	return a.x<b.x;
}
int sum=0,n;
void dfs(int i,int ans)
{
	if(i==n)
	{
		sum=max(sum,ans+1);
		return;
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值