当前位置:首页 > 题解目录 > 正文内容

【题解目录】友好城市

亿万年的星光3年前 (2023-05-25)题解目录3994

【题目描述】

Palmia国有一条横贯东西的大河,河有笔直的南北两岸,岸上各有位置各不相同的N个城市。北岸的每个城市有且仅有一个友好城市在南岸,而且不同城市的友好城市不相同。

每对友好城市都向政府申请在河上开辟一条直线航道连接两个城市,但是由于河上雾太大,政府决定避免任意两条航道交叉,以避免事故。编程帮助政府做出一些批准和拒绝申请的决定,使得在保证任意两条航线不相交的情况下,被批准的申请尽量多。

【输入描述】

第1行,一个整数N(1≤N≤5000),表示城市数。

第2行到第n+1行,每行两个整数,中间用1个空格隔开,分别表示南岸和北岸的一对友好城市的坐标。(0≤xi≤10000)

【输出描述】

仅一行,输出一个整数,表示政府所能批准的最多申请数。

【样例输入】

7
22 4
2 6
10 3
15 12
9 8
17 17
4 2

【样例输出】

4


【题目分析】

  1. 注意,每个城市只能建一个桥

  2. 桥和桥之间不能相连

  3. 按照测试样例,我们可以画出如下图:

从上图可以看出,最优解是

(4,2)

(9,8)

(15,12)

(17,17)


可以看出,将某一侧的城市位置进行排序后
在对岸的友好城市位置的最长上升子序列的长度 即为 桥最多能建立的数量

【参考答案】


#include <bits/stdc++.h>
using namespace std;
int dp[5005];
//对应关系的结构体 
struct point{
	int first;  //友好城市的南岸 
	int second; //友好城市的北岸 
};
point a[5005]; 
bool cmp(point q1,point q2){
	return q1.first<q2.first;
}
int main()
{
	int n;
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i].first>>a[i].second;  //输入一组数据 
	}
	sort(a+1,a+n+1,cmp); //排序 
	for(int i=1;i<=n;i++)
	{
		dp[i]=1; //每次开始重置 
		for(int j=1;j<i;j++)
		{
			if(a[i].second>a[j].second)
			{
				dp[i]=max(dp[i],dp[j]+1);
			}
		}
	}
	int ans=0;
	for(int i=1;i<=n;i++) 
		ans=max(dp[i],ans);  //求最长上升子序列 
	cout<<ans;
	return 0;
}


    扫描二维码推送至手机访问。

    版权声明:本文由青少年编程知识记录发布,如需转载请注明出处。

    分享给朋友:

    相关文章

    【题解】种花问题

    【题目描述】假设有一个很长的花坛,一部分地块种植了花,另一部分却没有。可是,花不能种植在相邻的地块上,它们会争夺水源,两者都会死去。给你一个整数数组 flowerbed 表示花坛,...

    【题解】AC

    4.AC(ac.cpp) 【问题描述】 小明获得了一行字符串,他想知道在不改变字符顺序的情况下,从前到后最多能组合出多少个ac? (a和c的位置可以不连续)比如:字符串为addca...

    绝对素数

    【题目描述】如果一个自然数是素数,且它的数字位置经过对换后仍为素数,则称为绝对素数,例如13。试求出所有二位绝对素数。【输入描述】无【输出描述】所有二位绝对素数(由小到大,一个数一行)。【输入样例】无...

    【题解】连通块

    【题目描述】一个n × m的方格图,一些格子被涂成了黑色,在方格图中被标为1,白色格子标为0。问有多少个四连通的黑色格子连通块。四连通的黑色格子连通块指的是一片由黑色格子组成的区域,其中的每个黑色格子...

    因子分解

    【题目描述】输入一个数,输出其素因子分解表达式。【输入描述】输入一个整数 n (2≤n<100)。【输出描述】输出该整数的因子分解表达式。表达式中各个素数从小到大排列。如果该整数可以分解出因子a...

    求Π的值

    【题目描述】根据公式:arctanx(x)=x−x^3/3+x^5/5−x^7/7+…和π=6arctanx(1/√3).定义函数arctanx(x),求当最后一项小于10^(−6)时π的值。【输入描...