1. 程式人生 > >【貪心】codevs1214:線段覆蓋

【貪心】codevs1214:線段覆蓋

style none space 輸出 span 中一 lap input post

題目描述 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 #include <iostream>
 2 #include <stdio.h>
 3 #include <algorithm>
 4 using namespace
std; 5 struct node 6 { 7 int sta,endd; 8 }; 9 node p[110],q[110]; 10 bool cmp(node a,node b) 11 { 12 return a.endd<b.endd; 13 } 14 int main() 15 { 16 int n; 17 cin>>n; 18 for(int i=0;i<n;i++) 19 { 20 scanf("%d%d",&p[i].sta,&p[i].endd);
21 if(p[i].sta>p[i].endd) 22 swap(p[i].sta,p[i].endd); 23 } 24 sort(p,p+n,cmp); 25 int flag=0; 26 int cnt=0; 27 q[cnt].sta=p[0].sta; 28 q[cnt++].endd=p[0].endd; 29 for(int i=1;i<n;i++) 30 { 31 if(p[i].sta<p[flag].endd) 32 continue; 33 flag=i; 34 q[cnt].sta=p[i].sta; 35 q[cnt].endd=p[i].endd; 36 cnt++; 37 } 38 cout << cnt << endl; 39 for(int i=0;i<cnt;i++) 40 { 41 printf("%d %d\n",q[i].sta,q[i].endd); 42 } 43 return 0; 44 }
View Code

【貪心】codevs1214:線段覆蓋