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 }