8602 區間相交問題
阿新 • • 發佈:2019-01-10
8602 區間相交問題(必做)
時間限制:1000MS 記憶體限制:1000K
提交次數:1966 通過次數:468
題型: 程式設計題 語言: C++;C;VC;JAVA
Description
給定x軸上n個閉區間,去掉儘可能少的閉區間,使剩下的閉區間都不相交。
注意:這裡,若區間與另一區間之間僅有端點是相同的,不算做區間相交。例如,[1,2]和[2,3]算是不相交區間。
輸入格式
第一行一個正整數n(n<=50),表示閉區間數。接下來n行中,每行2個整數,表示閉區間的2個整數端點。
輸出格式
輸出去掉的最少的閉區間數。
輸入樣例
3
10 20
10 15
12 15
輸出樣例
2
這個問題基本等同於書本的活動安排問題。
網上的一種用了pair,所以寫得有點噁心。記住 second 是左端點, first 才是右端點就行了。
#include <iostream>
#include <utility>
#include <algorithm>
using namespace std;
int main()
{
int n;
while(cin>>n)
{
pair<int,int> p[n];
for(int i=0; i<n; i++)
{
cin >> p[i].second;
cin >> p[i].first;
if(p[i].second > p[i].first)
{
swap(p[i].second, p[i].first);
}
}
sort(p, p+n);
int last, cnt;
last = p[0].first;
cnt = 1;
for(int i=1; i<n; i++)
{
if(p[i].second >= last)
{
cnt++;
last = p[i].first;
}
}
cout << n - cnt << endl;
}
return 0;
}
第二種:
#include <iostream>
#include <string.h>
#include <algorithm>//c++ sort
using namespace std;
int cmp( const int &a, const int &b ){
if( a > b )
return 1;
else
return 0;
}// sort(a,a+n,cmp);
struct Extent
{
int a,b;
bool operator < (const Extent& S)const
{
return b < S.b;
}
}B[10002];
int main()
{
int s[100];
int f[100];
int n,m;
cin >>n;
m=n;
for(int i=1;m>0;i++,m--){
cin >>B[i].a;
cin >>B[i].b;
}
sort(B,B+n);
// int A[100];
// memset(A,0,100*sizeof(int));
int sum=0;
int end = -1;
for(int i=1;i<=n;i++){
if(end<=B[i].a){
end=B[i].b;
sum++;
}
}
cout << n-sum << endl;
return 0;
}
第三種:#include <iostream>
#include <stdio.h>
using namespace std;
int n;
int s[100];
int e[100];
void myS(){
for(int i=0;i<n;i++){
for(int j=i;j<n;j++){
if(e[i]>e[j]){ //注意是比較結束時間
int temp = s[i];
s[i] = s[j];
s[j] = temp;
temp = e[i];
e[i] = e[j];
e[j] = temp;
}
}
}
}
int main()
{
freopen("in.txt","r",stdin);
cin >> n;
for(int i=0;i<n;i++)
cin >> s[i] >> e[i];
myS();
int num =1; // 注意num 至少為1
int ee = e[0]; //假定第一個為標準
for(int i=1;i<n;i++){
if(ee<=s[i]){ //注意是>= 邊界問題
num++;
ee = e[i];
}
}
cout << n-num << endl;
return 0;
}