经济节约
Description
由于经济紧张,某国国王决定减少一部分多余的士兵,这些士兵在边界都有各自的管辖范围。例如,士兵x 的管辖范围[ax,bx]。
我们定义:对于i号士兵,如果存在j号士兵的管辖范围[aj,bj], aji且bij成立,那么i号士兵就是多余的。给出多个士兵的管辖范围,问有多少个士兵是多余的?
Input
有多组数据,每组数据的第一行为一个整数n(1<=n<=100000),下面n行每行包含两个整数ai,bi,代表i号士兵的管辖范围(0<=aii<=200000)。
所有的ai是不同的,bi也是不同的。
Output
输出多余士兵的个数。
Sample Input
5
0 10
2 9
3 8
1 15
6 11
Sample Output
3
题目意思:给定一个士兵的管辖范围,若再有士兵的管辖范围包含他,那么他就是多余的,反之就不是。
解题思路:这道题有一点贪心的意味,贪心方案将每一个士兵按照管辖的结束范围(或者开始的范围)有小到大排序,比较另一边,遇到小的加一,大的更新。
上代码:
#include<stdio.h>
#include<algorithm>
using namespace std;
struct message
{
int x;
int y;
} a[];
int my_comp(message a,message b)
{
if(a.y>b.y)
return ;
else
return ;
}
int main()
{
int n,i,count,min;
while(scanf("%d",&n)!=EOF)
{
for(i=; i<n; i++)
{
scanf("%d%d",&a[i].x,&a[i].y);
}
sort(a,a+n,my_comp);
min=a[].x ;
count=;
for(i=; i<n; i++)
{
if(a[i].x<min)
{
min=a[i].x;
}
else
{
count++;
}
}
printf("%d\n",count);
}
return ;
}