问题 K: 找点
时间限制: 3 Sec 内存限制: 128 MB提交: 3 解决: 3
[提交][状态][讨论版]
题目描述
上数学课时,老师给了LYH一些闭区间,让他取尽量少的点,使得每个闭区间内至少有一个点。但是这几天LYH太忙了,你们帮帮他吗?
输入
多组测试数据。
每组数据先输入一个N,表示有N个闭区间(N≤100)。
接下来N行,每行输入两个数a,b(0≤a≤b≤100),表示区间的两个端点。
每组数据先输入一个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
注:把所有区间按b从小到大排序(b相同时a从大到小排序),则如果出现区间包含的情况,小区间一定排在前面。第一个区间应该取哪个点呢?此处的贪心策略是:取最后一个点。
#include<stdio.h> int main() { int N; while(scanf("%d",&N)!=EOF) { int a[110],b[110]; int i,j,count=1; int dian_x,dian_y; for(i=0;i<N;i++) scanf("%d%d",&a[i],&b[i]); for(i=0;i<N-1;i++) for(j=i+1;j<N;j++) { if(b[i]>b[j]) { int t,tt; t=b[i]; b[i]=b[j]; b[j]=t; tt=a[i]; a[i]=a[j]; a[j]=tt; } if(b[i]==b[j]) { if(a[i]>a[j]) { int ttt; ttt=a[i]; a[i]=a[j]; a[j]=ttt; } } } i=0;dian_x=b[i]; for(i=1;i<N;i++) { if(a[i]>dian_x) count++; if(a[i]<=dian_x) continue; } printf("%d ",count); } return 0; }