1. 程式人生 > >【貪心】線段覆蓋(題解)

【貪心】線段覆蓋(題解)

思路稍微變一變 切記鑽牛角尖

題目描述 Description

    給定x軸上的N(0<N<100)條線段,每個線段由它的二個端點a_I和b_I確定,I=1,2,……N.這些座標都是區間(-999,999)的整數。有些線段之間會相互交疊或覆蓋。請你編寫一個程式,從給出的線段中去掉儘量少的線段,使得剩下的線段兩兩之間沒有內部公共點。所謂的內部公共點是指一個點同時屬於兩條線段且至少在其中一條線段的內部(即除去端點的部分)。

 


輸入描述 Input Description

    輸入第一行是一個整數N。接下來有N行,每行有二個空格隔開的整數,表示一條線段的二個端點的座標。

 


輸出描述 Output Description

    輸出第一行是一個整數表示最多剩下的線段數。

 

 

#include<cstdio>
#include<algorithm>
#include<iostream>
using namespace std;
struct find
{
 int a,b;
}sum[101];
bool com(struct find &x,struct find &y)
{
 return x.a<y.a;
}
int main()
{
 int n,tot=1;
 scanf("%d",&n);
 for(int i=1;i<=n;i++)
 {
  scanf("%d%d",&sum[i].a,&sum[i].b);
  if (sum[i].a>sum[i].b)
   swap(sum[i].a, sum[i].b);
 }
 sort(sum+1,sum+n+1,com);
 int end = sum[1].b;
 for (int i = 2; i <= n; i++)
 {
  if (sum[i].a >= end)
  {
   tot++;
   end = sum[i].b;
  }
 }
 printf("%d",tot);
 return 0;
}

 

可以把問題簡化

排掉最少的線段=保留最多的線段

 

本題的無後效性:是否保留 對後面的線段不產生影響 都是獨立存在的個體