zoukankan      html  css  js  c++  java
  • 1214 线段覆盖wiki oi

    题目描述 Description

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

    输入描述 Input Description

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

    输出描述 Output Description

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

    样例输入 Sample Input

    3

    6  3

    1  3

    2  5

    样例输出 Sample Output

    2

    数据范围及提示 Data Size & Hint

    0<N<100

    分析:

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

     1 #include<stdio.h>
     2 #include<string.h>
     3 #include<iostream>
     4 #include<cmath>
     5 #include<stack>
     6 #include<ctype.h>
     7 #include <algorithm>
     8 using namespace std;
     9 struct node
    10 {
    11     int a,b;
    12 }s[101];
    13 int cmp(node x,node y)
    14 {
    15     return x.b<y.b;
    16 }
    17 int main()
    18 {
    19     int n;
    20     cin>>n;
    21     for(int i=0; i<n; i++)
    22     {
    23         cin>>s[i].a>>s[i].b;
    24         if(s[i].a>s[i].b) swap(s[i].a, s[i].b);
    25     }
    26     sort(s,s+n,cmp);
    27     int ans=0,max=-1000;
    28     for(int i=0; i<n; i++)
    29     {
    30         if(s[i].a>=max)
    31         {
    32             ans++;
    33             max=s[i].b;
    34         }
    35     }
    36     cout<<ans<<endl;
    37     return 0;
    38 }

    序列型动态规划(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;
    }
    随便写写。一点学习心得。。。--如果本文章没有注明转载则为原创文章,可以随意复制发表,但请注明出处与作者
  • 相关阅读:
    mysql sql语句多表合并UNION ALL和UNION
    ajax向后台传递数组参数并将后台响应的数据赋值给一个变量供其它插件使用
    java web项目中后台控制层对参数进行自定义验证 类 Pattern
    java后台实体类设置默认值
    app连接线上数据库进行本地接口测试
    idea常用快捷键
    百度搜索小脚本
    有道翻译小脚本
    洛谷 P3275 [SCOI2011]糖果
    洛谷 P2048 BZOJ 2006 [NOI2010]超级钢琴
  • 原文地址:https://www.cnblogs.com/ganhang-acm/p/4181438.html
Copyright © 2011-2022 走看看