前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >zoj 3197 Google Book(最小区间覆盖)

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

作者头像
用户1624346
发布2018-04-17 16:10:32
6210
发布2018-04-17 16:10:32
举报
文章被收录于专栏:calmoundcalmound

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,竟然看不出来,害我和标准程序一个一个核对,最后才找出来,下次再这样错了,就不要核对了

自己试测试数据,不要错了就核对,我发现最近自己找代码错误的能力大减

代码语言:javascript
复制
#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;
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2013-03-12 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档