HDU-1025 Constructing Roads In JGShining's Kingdom

题目大意:就是说怎样建道路才使得所建道路最多。任意两天道路不能交叉。

解题思路:因为是按城市按顺序排列。所以我们只需将两个城市序号用结构体存下来。对富人城市排序。

这样就成了一个序列了,这样就成了一个LIS的裸题了。

ps:1、这题目坑的地方在于输出的地方,讲究英语语法。。。如果一条路输出road,多条输出roads。之前就wa了。

  2、网上说用nlogn的算法,也就是查找用二分,但是我并没有用二分也AC了。

AC代码:

 1 #include<iostream>
 2 #include<stdio.h>
 3 #include<string.h>
 4 #include<algorithm>
 5 using namespace std;
 6 struct Node{
 7     int st,en;
 8 }a[500050];
 9 int dp[500050];
10 int mx[500050];
11 int INF=99999999;
12 bool cmp(Node a,Node b){
13     return a.st<b.st;
14 }
15 int main(){
16     int n;
17     int T=1;
18     while(~scanf("%d",&n)){
19         for(int i=1;i<=n;i++){
20             scanf("%d%d",&a[i].st,&a[i].en);
21         }
22         sort(a+1,a+n+1,cmp);
23         memset(dp,0,sizeof(dp));
24         for(int i=0;i<=500050;i++){
25             mx[i]=INF;
26         }
27         mx[0]=0;
28         int len=0;
29         for(int i=1;i<=n;i++){
30             for(int j=len;j>=0;j--){
31                 if(a[i].en>mx[j]){
32                     dp[i]=j+1;
33                     mx[j+1]=min(a[i].en,mx[j+1]);
34                     break;
35                 }
36             }
37             len=max(len,dp[i]);
38         }
39         cout<<"Case "<<T++<<':'<<endl;
40         if(len==1)//坑!!!
41             cout<<"My king, at most "<<len<<" road can be built."<<endl<<endl;
42         else
43             cout<<"My king, at most "<<len<<" roads can be built."<<endl<<endl;
44     }
45     return 0;
46 }
原文地址:https://www.cnblogs.com/ISGuXing/p/7260211.html