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;
}
原文地址:https://www.cnblogs.com/zsboy/p/2954999.html