codevs 1214 線段覆蓋
阿新 • • 發佈:2017-05-05
std splay ron clu names per pac str 100%
輸入描述 Input Description
1214 線段覆蓋
時間限制: 1 s 空間限制: 128000 KB 題目等級 : 黃金 Gold 題目描述 Description
給定x軸上的N(0<N<100)條線段,每個線段由它的二個端點a_I和b_I確定,I=1,2,……N.這些坐標都是區間(-999,999)的整數。有些線段之間會相互交疊或覆蓋。請你編寫一個程序,從給出的線段中去掉盡量少的線段,使得剩下的線段兩兩之間沒有內部公共點。所謂的內部公共點是指一個點同時屬於兩條線段且至少在其中一條線段的內部(即除去端點的部分)。
輸入第一行是一個整數N。接下來有N行,每行有二個空格隔開的整數,表示一條線段的二個端點的坐標。
輸出描述 Output Description輸出第一行是一個整數表示最多剩下的線段數。
樣例輸入 Sample Input3
6 3
1 3
2 5
樣例輸出 Sample Output2
數據範圍及提示 Data Size & Hint0<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 15int 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 線段覆蓋