题目描述
你有若干个区间,表示为[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更新为当前右端点,也就是每次都尽量“往右够”。