题目:
数轴上有 n 个闭区间 [a_i, b_i]。取尽量少的点,使得每个区间内都至少有一个点(不同区间内含的点可以是同一个)
Input
第一行1个整数N(N<=100)
第2~N+1行,每行两个整数a,b(a,b<=100)
Output
一个整数,代表选点的数目
思路:
该题是一个典型的贪心算法题目。先将区间根据右端点大小从小到大排列,若右端点相等,则按左端点从大到小排列。之后,从右端点最小的区间开始,每一步的贪心策略为:检查区间内是否有点存在(这个点可以来自上一个区间),没有则选择区间的最右端为一个被选点,计数器加一,然后前进到下一个区间。当对每一个区间都执行完上述步骤时,计数器内的数字即为答案。
代码:
#include <iostream>
#include <algorithm>
using namespace std;
struct section
{
int point;
int low;
int high;
bool operator <(section &se)
{
if(high==se.high)
return low>se.low;
else
return high<se.high;
}
};
section s[101];
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>s[i].low>>s[i].high;
}
sort(s,s+n);
s[0].point=s[0].high;
int count=1;
for(int i=1;i<n;i++)
{
if(s[i].low<=s[i-1].high)
{
if(s[i-1].point>=s[i].low)
{
s[i].point=s[i-1].point;
}
else
{
s[i].point=s[i].high;
count++;
}
}
else
{
s[i].point=s[i].high;
count++;
}
}
cout<<count;
}