ZJNU 1217 - 航线问题——高级
将所有航线的其中一边排序后,另一边进行类dp
定义一个数组c,c[i]表示在所有能够开通i条航线的组合中,位置序号最大的那条航线的序号的最小值
比如下面一个样例
1 3
2 4
3 1
4 2
此时对于航线左边的位置序号已经是排好序的了
那么只需要考虑右边的情况
在所有只开通1条航道的组合中
右侧出现的结果可能是{1},{2},{3},{4}
所以c[1]=1
在所有只开通2条航道的组合中
右侧出现的结果可能是{3,4},{1,2}
这里有两个组合,每个组合位置序号最大的元素分别是4和2,取小
得到c[2]=2
同时我们可以发现c数组是严格递增的
那么定义完了c数组,说下它有什么用
因为航线左端排好序,每次考虑的值都是右端序号
重新举个例子
1 4
2 5
3 1
4 2
5 3
只拿右端序列,得到dp对象为4 5 1 2 3
考虑4,得到c[1]=4,答案更新为1
考虑5,因为5>4,且左侧序号递增,所以可以得到这条航线与终点为4的航线不重叠,可以组合,所以c[2]=5,答案更新为2
考虑1,因为c数组内没有元素比1小,所以更新c[1]=1,答案不变,为2
考虑2,得到c[1]<2,所以可以和此时c[1]指代的航线组合,更新c[2]=2,答案不变,为2
考虑3,得到c[2]<3,所以可以和此时c[2]指代的2条航线组合,c[3]=3,答案更新为3
首先,答案就是能够组合在一起的最大数量,即c数组最大的下标
那么为什么可以这样更新呢?
从形式上看,更新了数组之后相当于破坏了前面的航线的结论(看上去会让前面的航线交叉)
实际上,因为每考虑到一个点的时候,可以视为前面的点能组合的都已经组合完毕
更新c数组的元素,是为了贪心让之后的点加进来后对答案贡献更大,让其后的点能有更优的组合
对于代码实现,取用lower_bound函数或者手动模拟二分查找(已知现有c数组是有序的)
#include<iostream>
#include<algorithm>
#include<cstring>
#define INF 0x3f3f3f3f
using namespace std;
const int m=;
struct line{
int a,b;
bool operator < (const line& x) const{
return a<x.a;
}
}r[m];
int c[m];
int main(){
ios::sync_with_stdio();
cin.tie();cout.tie();
int T,n,i,p,ans;
cin>>T;
while(T--){
cin>>n;
for(i=;i<=n;i++)
cin>>r[i].a>>r[i].b;
sort(r+,r++n);
memset(c,INF,sizeof c);
ans=;
for(i=;i<=n;i++){
p=lower_bound(c+,c++ans,r[i].b)-c;
ans=max(ans,p);
c[p]=r[i].b;
}
cout<<ans<<endl;
} return ;
}
ZJNU 1217 - 航线问题——高级的更多相关文章
- ZJNU 1223 - 素数距离——高级
因为最大可以达到int极限 明显直接筛选不可能完成 所以从其因子入手 因为任何不是素数的数都有除了1与其自身之外的因子 因此,我们筛出2^(31/2)≍46350之内的所有素数,以其作为因子再将题目给 ...
- ZJNU 1205 - 侦探推理——高级
双层枚举嫌疑犯与当日是星期几,统计真话与假话是否满足题意 注意 fake<=N&&fake+neutral>=N 即假话数量不大于N,假话加上没用的废话数量不小于N (注意 ...
- hdu 3047 Zjnu Stadium 并查集高级应用
Zjnu Stadium Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tot ...
- ZJNU 1538 - YN!ngC的取子游戏--高级
Nim博弈 因为移动到第0阶会消失 所以可以得到从最后一个人操作必定是把第1阶所有子全部移动到第0阶 递推可得,最后一个能把奇数阶的子移动到偶数阶上的人将会必胜 所以这个必胜条件就是奇数阶上的子全部为 ...
- ZJNU 1367 - Party--中高级
寻找从i到X,再从X到i的最短路 可以在正向图中从X开始跑一遍最短路,每个点的距离dis1[i]当作从X回到点i的距离 再将图反向从X再跑一遍,每个点的距离dis2[i]当作从i到点X的距离 最后搜索 ...
- ZJNU 1333 - 第二题 blocks--中高级
因为放一个就需要判断一次,每一次跑一遍全图bfs显然是不现实的 又因为点只有三种,黑白无 所以可以用并查集优化 添加一个棋子就判断周围四个的组别情况 注意出现的情况与答案关系之间的判别 /* Writ ...
- ZJNU 1269 - 灯塔——高级
根据题目输入可以得到一个有向图 信号可以根据有向图的传递性传递,因此可以说是找到这个有向图的所有父亲即可 但又要考虑可能会出现环这类情况 所以跑一遍强连通分量模板,再根据分块后的图找到入度为0的块,把 ...
- ZJNU 1244/1245 - 森哥数——高级
打表找规律吧…… 一定要记得每一步都得开long long 然后可以发现所有的森哥数每一位只可能是0,1,2,3 就可以想到最高O(3^9)的算法 枚举1e9之内的所有满足条件的数判断 枚举9位数,最 ...
- ZJNU 1213 - 取水——高级
某个村庄i可以打一口井取水花费费用Wi,也可以与有水的村庄连接取水 又因为不可能没有一个村庄不打井(即至少有一个村庄打井,其余村庄连向它) 实际上就可以理解为,将水井看作第N+1个村庄,需要有村庄与这 ...
随机推荐
- 吴裕雄 Bootstrap 前端框架开发——Bootstrap 字体图标(Glyphicons):glyphicon glyphicon-facetime-video
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...
- P1013 数素数
转跳点:
- 关于SI4432数据手册的简单讲解
SI4432是高度集成度单芯片无线ISM收发器件.EZRadioPRO系列包括了发射机.接收机和射频收发器,让设计工程师可以有选择的设计利用里面的无线部分. SI4432提供了先进的无线功能,包括连续 ...
- java初学小项目-酒店客房管理系统
最近初次接触JAVA,感觉之前学的C语言很有用,跟着视频做了一个小项目-酒店客房管理系统 /* 酒店客房管理系统 */ import java.util.Scanner;//通过键盘来输入命令需要的引 ...
- C语言预处理理论-宏定义2
宏定义21.带参宏和带参函数的区别(1)宏定义是在预处理期间处理的,而函数是在编译期间处理的.这个区别带来的实质差异是:宏定义最终是在调用宏的地方把宏体原地展开,而函数是在调用函数处跳转到函数中去执行 ...
- mysql+MHA高可用 (一主双从)
1.准备三台服务器 10.0.0.12 10.0.0.13 10.0.0.14 2.在三台服务器上执行操作 时间同步 [root@ c7m01 ~]# echo "*/5* * * * /u ...
- HTTP协议、时间戳
1.什么是HTTP协议 超文本传输协议(英文:HyperText Transfer Protocol,缩写:HTTP)是一种用于分布式.协作式和超媒体信息系统的应用层协议.HTTP是万维网的数据通信的 ...
- 第四章:Schema与数据类型优化
1. 选择优化的数据类型 选择数据类型的原则 更小的通常更好:选择可以正确存储数据的最小数据类型 小的数据类型消耗更少的内存.CPU;占用更少的磁盘 选用简单的数据类型:简单的数据类型通常需要更少的C ...
- HttpServletRequest 的常用属性说明
HttpServletRequest 的常用属性总是被窝遗忘,人老了记性就不好.所以做个笔记,方便以后查看. 测试地址:http://127.0.0.1:8080/Test/test getConte ...
- 6.44 以元素值为x的节点为根的子树的深度(递归实现)
题目:求二叉树中以元素值为x的节点为根的子树的深度 #include<cstdio> #include<malloc.h> typedef struct btree{ char ...