您的位置:首页 > 编程语言 > Go语言

zoj 3197 Google Book(最小区间覆盖)

2013-03-12 08:50 337 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: