经济节约
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 ; }