113
百度
NYOJ891-找點
找點
時間限製:2000 ms | 內存限製:65535 KB
難度:2
描述
上數學課時,老師給了LYH一些閉區間,讓他取盡量少的點,使得每個閉區間內至少有一個點。但是這幾天LYH太忙了,你們幫幫他嗎?
輸入
多組測試數據。
每組數據先輸入一個N,表示有N個閉區間(N≤100)。
接下來N行,每行輸入兩個數a,b(0≤a≤b≤100),表示區間的兩個端點。
輸出
輸出一個整數,表示最少需要找幾個點。
樣例輸入
4
1 5
2 4
1 4
2 3
3
1 2
3 4
5 6
1
2 2
樣例輸出
1
3
1
來源
原創
思路:
貪心算法
1.先對區間按照右邊界從小到大排序
2.每次取區間的左邊界最大值和右邊界最小值,如果兩個區間剛好相鄰,取他們的相交點作為左右邊界,
隻要每次新的區間的左邊界不大於等於原來的右邊界,取點總數都不用加1,否則加1
例如:
6
3 4
2 4
3 10
7 9
8 11
8 14
排序後是:
2 4
3 4
7 9
3 10
8 11
8 14
過程:sum=1;
首先,模板為[2,4],3,4加入, 比較左右點,更新為[3,4],此時依舊sum=1;
然後,模板為[3,4],7,9加入, 發現7>4, 此時更新左右邊界為[7,9],sum+1=2;
然後,模板為[7,9],3,10加入,比較左右點,無需更新,此時依舊sum=2;
然後,模板為[7,9],8,11加入,比較左右點,更新為[8,9],此時依舊sum=2;
然後,模板為[8,9],8,14加入,比較左右點,不更新,此時sum依舊為2
最終答案便是2
圖:

AC代碼:
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
struct node
{
int x,y;
}a[200];
int cmp(node a,node b)
{
if(a.y!=b.y) return a.y<b.y;
}
int main()
{
int i,j,n,m1,m2,sum,x;
while(scanf("%d",&n)!=EOF)
{
for(i=0;i<n;i++)
scanf("%d %d",&a[i].x,&a[i].y);
sort(a,a+n,cmp);
m1=a[0].x;m2=a[0].y;sum=1;x=0;
//printf("m1=%d m2=%d\n",m1,m2);
for(i=1;i<n;i++)
{
if(a[i].x<m2&&a[i].x>m1)
m1=a[i].x;
else
{
if(a[i].x==m2)
{
m1=a[i].x;
m2=a[i].x;
}
if(a[i].x>m2)
{
sum++;
m1=a[i].x;
m2=a[i].y;
}
}
//printf("m1=%d m2=%d\n",m1,m2);
}
printf("%d\n",sum);
}
return 0;
}
最後更新:2017-04-03 12:56:36