1. 程式人生 > >codevs 1214 線段覆蓋

codevs 1214 線段覆蓋

std splay ron clu names per pac str 100%

1214 線段覆蓋

時間限制: 1 s 空間限制: 128000 KB 題目等級 : 黃金 Gold 題目描述 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

貪心,二元組按結束坐標升序,循環1-n記錄當前尾指針最大值判斷下一個頭指針是否與其重疊

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<algorithm>
 4 using namespace std;
 5 pair<int,int>p[1000001];
 6 typedef pair<int, int> pi;
 7 
 8 bool cmp(pi a,pi b)
 9 {
10     if(a.second<b.second)return 1;
11     else return 0;
12     
13 }
14 
15
int main() 16 { 17 int n; 18 scanf("%d",&n); 19 int x; 20 int a,b; 21 for(int i=1;i<=n;i++) 22 { 23 scanf("%d%d",&a,&b); 24 if(a>b)swap(a,b); 25 p[i].first=a;p[i].second=b; 26 } 27 sort(p+1,p+n+1,cmp); 28 int maxn=-1000001,ans=0; 29 for(int i=1;i<=n;i++) 30 { 31 if(p[i].first>=maxn) 32 { 33 ans++;maxn=p[i].second; 34 } 35 36 } 37 cout<<ans; 38 }

codevs 1214 線段覆蓋