信息学奥赛一本通(1263:【例9.7】友好城市)
1263:【例9.7】友好城市
时间限制: 1000 ms 内存限制: 65536 KB
提交数: 7660 通过数: 4419
【题目描述】
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
【分析】
我们将每对友好城市看成一条线段,则这道题的描述化为:有N 条线段,问最少去掉多少条线,可以使剩下的线段互不交叉?
第一,以A岸为线的起点,而B岸为线的终点,先将所有的线按照A岸起点坐标值从小到大排序,按照每条线的B岸终点坐标计算交叉数。根据样例数据,对A岸a排序后得:
如果任意两条航线不相交,则原问题转换为求B岸的最大不下降序列,B岸只有不下降才能保证线段互不交叉。数据求解过程如下:
【参考代码1】
C代码如下:由于后台数据量不大,所以,直接用比较排序即可。
#include<stdio.h>
#define N 5010struct node //点坐标
{int a;int b;
}q[N];int f[N];int main()
{struct node t;int i,j,n,maxn,ans=0;scanf("%d",&n);for(i=1; i<=n; i++)scanf("%d%d",&q[i].a,&q[i].b);for(i=1; i<=n-1; i++) //比较排序{for(j=i+1; j<=n; j++){if(q[i].a > q[j].a){t=q[i];q[i]=q[j];q[j]=t;}else if(q[i].a == q[j].a){if(q[i].b > q[j].b){t=q[i];q[i]=q[j];q[j]=t;}}}}f[n]=1;for(i=n-1;i>=1;i--) //逆序求最长不下降序列 {maxn=0;for(j=i+1;j<=n;j++){if(q[i].b <= q[j].b && f[j]>maxn)maxn=f[j];}if(maxn>=0)f[i]=maxn+1;}for(i=1;i<=n;i++){if(f[i]>ans)ans=f[i];}printf("%d\n",ans);return 0;
}
【参考代码2】
C++代码如下:
#include <iostream>
#include <algorithm>using namespace std;typedef pair<int, int> PII;const int N = 5010;int n;
PII p[N];
int f[N];int main()
{cin >> n;for(int i = 1; i <= n; i++)cin >> p[i].first >> p[i].second;sort(p + 1, p + 1 + n);int ans = 0;for(int i = 1; i <= n; i++){f[i] = 1;for(int j = 1; j < i; j++)if(p[i].second > p[j].second)f[i] = max(f[i], f[j] + 1);ans = max(ans, f[i]);}cout << ans << endl;return 0;
}
http://ybt.ssoier.cn:8088/problem_show.php?pid=1263
信息学奥赛一本通(1263:【例9.7】友好城市)相关推荐
- 信息学奥赛一本通 1263:【例9.7】友好城市
[题目链接] ybt 1263:[例9.7]友好城市 [题目考点] 1. 动态规划:线性动规 2. 排序 [解题思路] 该题可以抽象为两条平行线上各有若干点,给定一些两条线上点之间的连线,在选出连线不 ...
- 【例1】 0/1背包《信息学奥赛一本通》【解法一】 02
/* [例1] 0/1背包<信息学奥赛一本通>[解法一] 02 http://ybt.ssoier.cn:8088/problem_show.php?pid=1267 */ #includ ...
- 【例8】合唱队形(《信息学奥赛一本通第五版》)
/* [例8]合唱队形(<信息学奥赛一本通第五版>) http://ybt.ssoier.cn:8088/problem_show.php?pid=1264 [问题描述] N位同学站成一排 ...
- 信息学奥赛一本通 2021:【例4.6】最大公约数
[题目链接] ybt 2021:[例4.6]最大公约数 [题目考点] 1. while循环 2. 求最大公约数 辗转相减法 辗转相除法 [解题思路] 解法1:枚举 取较小数字,从该数字的值开始从大到小 ...
- 信息学奥赛一本通(2032:【例4.18】分解质因数)
2032:[例4.18]分解质因数 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 582 通过数: 376 [题目描述] 把一个合数分解成若干个质因数乘积 ...
- 信息学奥赛一本通——2062:【例1.3】电影票
2062:[例1.3]电影票 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 57341 通过数: 34230 [题目描述] 已知一位小朋友的电影票价是10 ...
- 信息学奥赛一本通 1278:【例9.22】复制书稿(book) | 洛谷 P1281 书的复制
[题目链接] ybt 1278:[例9.22]复制书稿(book) 洛谷 P1281 书的复制 [题目考点] 1. 动态规划:线性动规 [解题思路] 该题可以抽象为:将由m个数字构成的序列分成k个子段 ...
- 信息学奥赛一本通1267:【例9.11】01背包问题(二维dp与滚动数组优化)
[题目描述] 一个旅行者有一个最多能装 MM 公斤的背包,现在有 nn 件物品,它们的重量分别是W1,W2,...,WnW1,W2,...,Wn,它们的价值分别为C1,C2,...,CnC1,C2,. ...
- 信息学奥赛一本通C++语言-----2036:【例5.3】开关门
[题目描述] 宾馆里有n(2≤n≤1000)n(2≤n≤1000) 个房间,从1∼n1∼n 编了号.第一个服务员把所有的房间门都打开了,第二个服务员把所有编号是22 的倍数的房间"相反处理& ...
- 信息学奥赛一本通——2068:【例2.6】鸡兔同笼
大家好(๑╹◡╹)ノ" 这里是小蒟蒻 一天没更新了呢! 今天给大家带来<信息学奥赛一本通--2068:[例2.6]鸡兔同笼> 题目: 2068:[例2.6]鸡兔同笼 时间限制: ...
最新文章
- Kubernetes集群部署(yum部署)
- PyTorch之深入理解list、ModuleList和Sequential。
- docker安装mysql指定_Docker安装MySql,并且使用外部客户端链接
- 本app(仿手机支付宝界面)ios源码
- java安装了为什么运行不了_安装jdk后运行javac可以运行,为什么不能运行java?...
- 基线系统需要受到更多关注:基于词向量的简单模型 | ACL 2018论文解读
- notify和wait
- scala一些奇怪的操作符的效果(持续更新中)
- 一个例子彻底搞懂C++的虚函数和纯虚函数
- Executor源码解读
- Oracle字符拆分函数,Oracle拆分字符串函数有哪些呢?
- matlab elif,MATLAB与fftfilt相当于Python
- 如何使用APUE源代码(UNIX高级编程)-转
- Java开发桌面程序学习(七)——ImageView设置图片以及jar包读取fxml文件
- winsock编程:关于因为头文件而报错的问题
- linux ssh x11,ssh服务器的x11 forwarding报错的解决
- PYQT5:基于QsciScintilla的代码编辑器分析10--语法高亮颜色选择
- ICMP数据包结构(转)
- 七种常见的数据分析法之:帕累托法则
- 第三版新视野大学英语读写教程4结业考点(1,2,3,5,6单元)
热门文章
- 桌面便签软件PNotes
- C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):目录
- 终于有人把AI、BI、大数据、数据科学讲明白了
- 用户画像有什么用?怎样用?6个场景案例给你讲明白
- 近 5 亿人的隐私,毁于一位程序员之手?
- linux主机添加discuz伪静态规则,(总结)Nginx下Discuz 7.2伪静态规则设置
- linux总线错误无法删除文件,linux – 系统D-Bus不允许使用conf文件来破坏所有权...
- 每周工作4天半可行吗?人社部回应:不宜在企业中广泛推行
- k8s + 微服务,王炸!
- 低代码平台真的能拯救程序员的996吗?