• 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;
    }
    


  • 相关阅读:
    C++ allocator
    C++操作符重载
    Theron (C++ concurrency library) 读后感
    第五章 [BX]和loop指令
    第四章 第一个程序
    第三章 寄存器(内存访问)
    第二章 寄存器
    第一章
    jquery下ajax异步执行操作笔记
    CSSFlex布局
  • 原文地址:https://www.cnblogs.com/keanuyaoo/p/3341863.html
Copyright © 2020-2023  润新知