1. 程式人生 > >18.2.27 codevs1214 線段覆蓋

18.2.27 codevs1214 線段覆蓋

圖片 head isp 輸入 線段 其中 接下來 event -s

題目描述 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 <math.h>
 3 #include <string.h>
 4 
 5 using namespace
std; 6 7 int main() 8 { 9 int n; 10 cin>>n;//共n條線段 11 int line[150][3];//存兩端點 12 for(int i=1;i<=n;i++) 13 { 14 cin>>line[i][1]>>line[i][2]; 15 if(line[i][1]>line[i][2]) 16 { 17 int tmp=line[i][1]; 18 line[i][1
]=line[i][2]; 19 line[i][2]=tmp; 20 } 21 } 22 int bef=-1000,sum=0; 23 while(1) 24 { 25 int min=1000,minn=0,flag=0; 26 for(int i=1;i<=n;i++) 27 { 28 if(line[i][2]<min&&line[i][1]>=bef)//符合條件的最優解 29 { 30 min=line[i][2]; 31 minn=i; 32 flag=1; 33 } 34 } 35 if(!flag) 36 break; 37 bef=line[minn][2]; 38 sum++; 39 40 } 41 cout<<sum<<endl; 42 return 0; 43 }
View Code

基本典型的貪心

18.2.27 codevs1214 線段覆蓋