区间选点问题

 题目描述

你有若干个区间,表示为[ai​,bi​],其中ai​,bi​为整数。

要求选若干个点,使得每个区间中有至少一个点(不同的区间允许公用一个点),求最少需要的点数。

输入格式

输入共n+1行:

第11行,22个用空格隔开的整数n,k,表示区间个数为n,区间一定不会超出[1,k]范围;

之后n行,每行22个整数ai​,bi​表示一个区间[ai​,bi​]。

输出格式

输出共11行,11个整数,为所求的最少点数。


输入样例#1

输入#1

6 10
1 2
2 3
5 6
3 4
4 5
6 7

输出样例#1

输出#1

3

说明/提示

1≤𝑛≤2000001≤n≤200000;1≤𝑘≤400001≤k≤40000。

---------------------------------------------------------------------------------------------------------------------------------

#include <bits/stdc++.h>

using namespace std;

struct node

{

int l,r;

}a[200010];

bool cmp(node n1,node n2)

{

return n1.r<n2.r;

}

int main()

{

int n,k;

cin>>n>>k;

for(int i=1;i<=n;i++)

cin>>a[i].l>>a[i].r;

sort(a+1,a+n+1,cmp);

int pre=a[1].r,cnt=1;

for(int i=2;i<=n;i++)

{

if(pre<a[i].l)

{

pre=a[i].r;

cnt++;

}

---------------------------------------------------------------------------------------------------------------------------------(不知为何这道题粘过来的时候没有空四格)

这道题是区间问题,要用贪心。因为是区间,所以要开结构体,一个l一个r,代表左右端点。

贪心思想:按右端点排升序,遍历一遍,用一个pre记录此时选的点。如果选的点“够不到”当前左端点了,就把pre更新为当前右端点,也就是每次都尽量“往右够”。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值