POJ 2376 Cleaning Shifts (贪心)

本文介绍了一种使用贪心算法解决区间覆盖问题的方法,旨在寻找覆盖特定范围所需的最少区间数量。通过合理排序和逐个检查区间的策略,确保算法能够有效地找到最优解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

链接

很简单的一道题,总是写傻逼。就是给你N个区间,问你能覆盖1到T全部,需要的最少区间个数。

很容易就能想到贪心,做法也很简单,只要按照first从小到大,first相同的按second从小到大。

每次都寻找first < end+1的然后second最大的就行。但我错误的认为,排序之后后面只要frist符合的一定second都比前面的大,结果没有更新找到的点,但应为first会改变,所以second的值也不确定。

所以。。。太傻逼了

代码如下:

#include<iostream>
#include<cstring>
#include<cmath>
#include<vector>
#include<set>
#include<map>
#include<algorithm>

using namespace std;
const int MAX = 25010;
typedef pair<int,int> P;
P p[MAX];
int N,T;
bool cmp(P A,P B){
    if(A.first == B.first)
        return A.second < B.second;
    else
        return A.first < B.first;
}
int Find(int x){
    int pos = x;
    for(int i=x+1;i<=N;++i){
        if(p[i].first <= p[x].second+1){
            if(p[i].second > p[pos].second)//这里要更新pos,因为后面的second不一定更大。
                pos = i;
        }
        else{
            break;
        }
    }
    return pos;
}
int solve(){
    int now = 0,end = 0,res = 0;
    while(end < T){
        int v = Find(now);
        if(v == now)
            return -1;
        else{
            res++;
            now = v;
            end = p[now].second;
        }
    }
    return res;
}
int main(void){
    cin >> N >> T;
    for(int i=1;i<=N;++i){
        cin >> p[i].first >> p[i].second;
    }
    sort(p+1,p+1+N,cmp);
    cout << solve() << endl;
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值