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;

}

 

你可能感兴趣的:(Google)