2782 友好城市
使得再保证任意两条航线不相交的情况下,被批准的申请尽量多,是一个动态规划
其实仔细审题,挺简单的
先得明白,这道题需要转化思想
对于两个友好城市的航道,可以想象成一个线段,而两个城市则可以想象成一条线段的终点和起点,所以要想这两条线段i,j不交叉,就需要让i的起点不大于j的起点,i的终点不大于j的终点
所以我们把起点或者终点将进行一个排序,满足了第一个性质,再把另外一个点进行跑一个最长不下降子序列就好了
#include<cstdio>
#include<cmath>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=2e5+5;
int n;
struct node{
int n,s;
} a[N];
int w[N];
int ans;
bool cmp(node a,node b)
{
return a.n<b.n;
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i].n>>a[i].s;//输入起点终点
}
sort(a+1,a+1+n,cmp);//起点排序
w[++ans]=a[1].s;
for(int i=2;i<=n;i++)
{
int ans1=lower_bound(w+1,w+ans+1,a[i].s)-w;//找到下降子序列的一段
w[ans1]=a[i].s;//记录位置
if(ans1>ans)
ans++;//记录答案
}
cout<<ans<<endl;
return 0;
}
本文介绍了一种解决“2782友好城市”问题的方法,通过将问题转化为寻找最长不下降子序列的问题来实现。具体步骤包括:将城市间的航线视为线段,并通过排序和动态规划算法求解。
587

被折叠的 条评论
为什么被折叠?



