题目:
题目地址:https://www.luogu.com.cn/problem/P2782
思路:
这个题乍一看没有啥规律,但是我们做多了贪心的问题就知道,这样的问题是可以转换成区间问题的,我们输入a和b,把小的一个当做左端点,另一个当做右端点,然后按照右端点从小到大排序,满足什么样的条件才可以把答案加1呢?
举个简单的例子
2 5 8
1 3 7
1和2连接,3和5连接,是不是3>1和5>2,只要满足这样的一个条件就行啦
上代码:
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<list>
#include<stack>
#include<string>
using namespace std;
#define ll long long
struct City{
int a;
int b;
}city[200010];
int cmp(City a, City b){
if(a.b<b.b)
return 1;
if(a.b==b.b)
return a.a<=b.a;
return 0;
}
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
{
int a,b;
cin>>a>>b;
if(a<b)
{
city[i].a=a;
city[i].b=b;
}
else {
city[i].a=b;
city[i].b =a;
}
}
sort(city,city+n,cmp);
int sum=1,left = city[0].a,right=city[0].b;
for(int i =1;i<n;i++)
{
if(city[i].a>left && city[i].b>right)
{
sum++;
left = city[i].a;
right = city[i].b;
}
}
cout<<sum;
}