HihoCoder1672 : 区间问题([Offer收割]编程练习赛41)(贪心)
时间限制:10000ms
单点时限:1000ms
内存限制:256MB
描述
给定N个区间[Ai, Bi],请你找到包含元素最少的整数集合S,使得每个区间都至少有两个整数在S中。
例如给定三个区间[1, 3], [1, 4], [2, 5],则S={2, 3}。
输入
第一行包含一个整数N。
以下N行每行包含两个整数Ai, Bi。
对于30%的数据,1 ≤ N ≤ 1000
对于100%的数据, 1 ≤ N ≤ 100000 1 ≤ Ai < Bi ≤ 1000000
输出
输出一个整数代表S的大小。
- 样例输入
-
3 1 3 1 4 2 5
- 样例输出
-
2
- 模型:借教室。
- 手段:贪心,按第二关键词或者第一关键字(应该可以)。
#include<cstdio> #include<cstdlib> #include<iostream> #include<algorithm> #include<cstring> using namespace std; const int maxn=2000010; struct in { int a; int b; } x[maxn]; bool cmp(in x,in y) { if(x.b==y.b) return x.a>y.a; return x.b<y.b;} int main() { int ans=0,n,i,j,laxt=0,pre=0; scanf("%d",&n); for(i=1;i<=n;i++) scanf("%d%d",&x[i].a,&x[i].b); sort(x+1,x+n+1,cmp); for(i=1;i<=n;i++){ if(pre>=x[i].a) continue; else if(laxt>=x[i].a) ans++,pre=laxt,laxt=x[i].b; else ans+=2,laxt=x[i].b,pre=laxt-1; } printf("%d\n",ans); return 0; }
It is your time to fight!