暑假-动态规划 III-(A - Constructing Roads In JGShining's Kingdom)
2015-08-02 11:20
260 查看
/* 题意:有2n个城市,其中有n个富有的城市,n个贫穷的城市,其中富有的城市只在一种资源富有, 且富有的城市之间富有的资源都不相同,贫穷的城市只有一种资源贫穷,且各不相同, 现在给出一部分贫穷城市的需求,每个需求都是一个贫穷的向一个富有的城市要资源, 且每个富有的城市都想向贫穷的城市输入自己富有的那部分资源,现在为了运输要建设多条路, 但是路与路之间不允许有交叉,求满足贫穷城市的各种要求最多可以建设多少条路 思路:将贫穷的城市按从小到大的顺序排列,然后求富有的城市序号的最大上升子序列LIS解决即可 注意:若用一般方法(2个for循环)会超时,所以用n*logn的二分查找。 还是注意输出格式(单复数和每个案例结尾都要输出空白行) */ #include<iostream> #include<stdio.h> #include<algorithm> using namespace std; const int MAXN=500005; struct Node { int p,c; }; Node city[MAXN]; int dp[MAXN]; bool cmp(Node a,Node b)//按p从小到大排序 { return a.p<b.p; } int main() { int n,ans=0; while(scanf("%d",&n)!=EOF) { for(int i=0;i<n;i++) { scanf("%d%d",&city[i].p,&city[i].c); } sort(city,city+n,cmp);//按p从小到大排序。 int top=0;//LIS长度 dp[0]=0;//初始化 for(int i=0;i<n;i++) { if(city[i].c>dp[top])//如果能接在后面形成更长的LIS { dp[++top]=city[i].c; } else//否则二分查找不大于city[i].c的第一个数,并替换 { int l=0,r=top,mid; while(l<=r) { mid=(l+r)/2; if(city[i].c>=dp[mid]) { l=mid+1; } else { r=mid-1; } } dp[l]=city[i].c; } } if(top==1)//注意长度为单数时。 { printf("Case %d:\nMy king, at most %d road can be built.\n\n",++ans,top); } else { printf("Case %d:\nMy king, at most %d roads can be built.\n\n",++ans,top); } } return 0; }
相关文章推荐
- 设计模式----单例模式
- [leedcode 162] Find Peak Element
- hdu 5339 Untitled
- hdfs小文件的解决方案
- 第七课第一节,T语言流程语句( 版本5.0)
- 2015 Multi-University Training Contest 3 hdu 5317 RGCDQ
- Android AudioFlinger加载HAL层流程
- 反射
- shell之find命令
- Linux的安装与android环境搭建的常见问题
- python进行爬虫
- 树与二叉树
- [Web3.0]什么是Web3.0/时代
- JavaWeb 分页管理
- Linux显示中文乱码解决方法
- Cinatra:高性能现代C++ Web框架
- django notes 二:URL dispatcher
- 自创关于java数据类型的面试题目,看看你到底会做多少
- 手机淘宝的高质量持续交付探索
- MVVM指南二:Flickr搜索深入