zoj 3197 Google Book(最小区间覆盖)
http://acm.sdibt.edu.cn:8080/judge/contest/view.action?cid=579#problem/E
题意:有一本书总共有n页,你可以查询n次,每一次可以查询的页码为ai <= i <= bi,即从第ai页到第bi页。问你最少可以查询几次能把这本书所有
的页码都可以查询到。
分析:这道题目,是最小区间覆盖
求解过程如下:首先对于所有的区间,按照x从小到大排序,再依次找没查询到的能覆盖的最大区间。假如当前没有看的书
页数为(sta,end),则找到符合x<=sta的区间里y最大的一个区间,然后将end=y;知道end==n为止
今天wa的恐怖啊,吧while写成了if,竟然看不出来,害我和标准程序一个一个核对,最后才找出来,下次再这样错了,就不要核对了
自己试测试数据,不要错了就核对,我发现最近自己找代码错误的能力大减
#include<stdio.h> #include<string.h> #include<algorithm> #include<map> #include<math.h> using namespace std; const int MN=5100; struct Node { int x,y; }; Node node[MN]; bool cmp(Node a,Node b) { if(a.x!=b.x) return a.x<b.x; return a.y>b.y; } int main() { int i,j,T,sum,n; scanf("%d",&T); while(T--) { scanf("%d",&n); for(i=0;i<n;i++) scanf("%d%d",&node[i].x,&node[i].y); sort(node,node+n,cmp); int sta=node[0].x,end=node[0].y; i=1; sum=1; j=end; while(i<n && sta==node[i].x) i++; while(end<n) { sta=end+1; while(node[i].x<=sta && i<n) { if(j<node[i].y) j=node[i].y; i++; } sum++; end=j; } printf("%d\n",sum); } return 0; }