• 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 }
  • 相关阅读:
    springBoot从入门到源码分析
    MQ疑难杂症小记
    dubbo学习思路梳理
    Zookeeper
    分布式系统理论概述
    mysql,存储引擎,事务,锁,慢查询,执行计划分析,sql优化
    tomcat学习步骤,附带打破双亲委派模型企业应用实战
    使用UtraISO为U盘制作系统启动盘
    洛谷P3369 splay或treap
    gym 101982 B题 Coprime Integers
  • 原文地址:https://www.cnblogs.com/ISGuXing/p/7260211.html
Copyright © 2020-2023  润新知