• wikioi 1214 线段覆盖


        给定x轴上的N(0<N<100)条线段,每个线段由它的二个端点a_I和b_I确定,I=1,2,……N.这些坐标都是区间(-999,999)的整数。有些线段之间会相互交叠或覆盖。请你编写一个程序,从给出的线段中去掉尽量少的线段,使得剩下的线段两两之间没有内部公共点。所谓的内部公共点是指一个点同时属于两条线段且至少在其中一条线段的内部(即除去端点的部分)。

        输入第一行是一个整数N。接下来有N行,每行有二个空格隔开的整数,表示一条线段的二个端点的坐标。

        输出第一行是一个整数表示最多剩下的线段数。

    3

    6  3

    1  3

    2  5

    2

    0<N<100

    贪心解法:首先将线段端点调整为左端点小于(或等于)右端点;第二,根据右端点将线段从小到大排序;第三,扫描一遍,每次遇到的第一个与当前的max不想交的即为最优选择。

    #include <iostream>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    struct node {
      int a,b;
    }x[100];
    int cmp(node x1, node x2)
    {
      return x1.b < x2.b;
    }
    int main()
    {
      int n;
      cin >> n;
      for(int i=0; i<n; i++)
      {
        cin >> x[i].a >> x[i].b;
        if(x[i].a>x[i].b) swap(x[i].a, x[i].b);
      }
      sort(x, x+n, cmp);
      int res = 0, max = -1000;
      for(int i=0; i<n; i++)
      {
        if(x[i].a >= max)
        {
          res++;
          max = x[i].b;
        }
      }
      cout << res;
      return 0;
    }
    


    序列型动态规划(DP):前两步同上,第三步,dp[i] = max(dp[i], (dp[j]+1))。第四,选择dp数组中最大值即为结果。

    #include <iostream>
    #include <cstring>
    using namespace std;
    
    int main()
    {
      int n,a[100],b[100],dp[100];
      cin >> n;
      for(int i=0; i<n; i++)
      {
        dp[i] = 1;
        cin >> a[i] >> b[i];
        if(a[i]>b[i])
        {
          int t = a[i];
          a[i] = b[i];
          b[i] = t;
        }
      }
      for(int i=n-1; i>0; i--)
      {
        for(int j=0; j<i; j++)
        {
          if(b[j]>b[j+1])
          {
            int t = b[j];
            b[j] = b[j+1];
            b[j+1] = t;
            t = a[j];
            a[j] = a[j+1];
            a[j+1] = t;
          }
        }
      }
      
      int max = 0;
      for(int i=1; i<n; i++)
      {
        for(int j=0; j<i; j++)
        {
          if(a[i]>=b[j])
            dp[i] = dp[i]>(dp[j]+1)?dp[i]:(dp[j]+1);
            if(max < dp[i]) max = dp[i];
            //cout << "i:" << i << " j:" << j << " dp[i]:" << dp[i] <<" dp[j]:" << dp[j] << endl;
        }
      }
      cout << max;
      return 0;
    }
    


  • 相关阅读:
    2018第一发:记一次【Advanced Installer】打包之旅
    Nginx 实现端口转发
    php支付宝手机网页支付类实例
    磁盘阵列操作实战
    错误修改/etc/fstab,导致系统无法开机
    linux 查看机器的cpu,操作系统等命令
    shell实现https登录
    linux tomcat配置https
    ArrayList和Vector以及synchronizedList
    java synchronized修饰普通方法,修饰静态方法,修饰代码块,修饰线程run方法 比较
  • 原文地址:https://www.cnblogs.com/keanuyaoo/p/3341863.html
Copyright © 2020-2023  润新知