【貪心】codevs1214:線段覆蓋
阿新 • • 發佈:2018-02-06
style none space 輸出 span 中一 lap input post
題目描述 Description
輸出描述 Output Description
給定x軸上的N(0<N<100)條線段,每個線段由它的二個端點a_I和b_I確定,I=1,2,……N.這些坐標都是區間(-999,999)的整數。有些線段之間會相互交疊或覆蓋。請你編寫一個程序,從給出的線段中去掉盡量少的線段,使得剩下的線段兩兩之間沒有內部公共點。所謂的內部公共點是指一個點同時屬於兩條線段且至少在其中一條線段的內部(即除去端點的部分)。
輸入描述 Input Description輸入第一行是一個整數N。接下來有N行,每行有二個空格隔開的整數,表示一條線段的二個端點的坐標。
輸出第一行是一個整數表示最多剩下的線段數。
樣例輸入 Sample Input3
6 3
1 3
2 5
樣例輸出 Sample Output2
數據範圍及提示 Data Size & Hint0<N<100
1 #include <iostream> 2 #include <stdio.h> 3 #include <algorithm> 4 using namespaceView Codestd; 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 }
【貪心】codevs1214:線段覆蓋