hdu 2600 简单贪心

题目大意

就是让你找到一个被区间覆盖的 最大的值

这可以用简单的贪心来解决 代码如下

#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
#include<stdio.h>  
using namespace std;
struct Nod{
    int s,e;
};
Nod a[101];
int cmp(Nod a,Nod b)
{
    return a.s < b.s;
}
int main()
{
    int n,p,q,i,j,ax,b;
    char s[30];
    while(~scanf("%d",&n))
    {
        int cnt = -6000001;
        scanf("%d%d",&p,&q);
        for(i = 0;i < n;i++)
        {
            scanf("%d%d",&ax,&b);
            a[i].s = ax;
            a[i].e = b;
            gets(s);
        }
        sort(a,a+n+1,cmp);
        int m = a[0].e;
        for(i = 1;i < n;i++)
        {
            if(a[i].s - 1 > a[i-1].e)
            {
                cnt = a[i].s-1;
            }
            m = m < a[i].e ? a[i].e:m;
        }
        if(m < q)
        cout<<q<<endl;
        else if(cnt != -6000001)
        cout<<cnt<<endl;
        else
        cout<<"Badly!"<<endl;
    }
    return 0;
}

代码大意 先把各个区间按照开始的时间进行排序从小到大

    然后遍历 设置一个m 每次m都是当前区间的最右边  其实m到最后判断的就是 所有区间最右边的值 如果该值没有 q大

那么说明q没有被覆盖所以直接输出q即可

cnt是为了检查:

若当前区间的开始 - 1 还大于上一个区间右边最大值 就说明 这两个区间 中间的值肯定有没有被覆盖的 而且这些值的最大值就是 当前区间的值-1

所以更新cnt

这样下来即可得到答案!






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值