poj 2376 贪心 区间覆盖问题

题意:

给n个区间 选择尽量少的区间 覆盖1~T这个区间

如果不能覆盖 输出-1

思路:

经典贪心 区间覆盖

将所有区间按照起点从小到大排序 取终点在最右边的那个区间

code:

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
#include<string>
#include<queue>
#include<map>
#include<set>
#include<cmath>
using namespace std;

#define INF 0x3f3f3f3f
#define PI acos(-1.0)
#define mem(a, b) memset(a, b, sizeof(a))
typedef pair<int,int> pii;
typedef long long LL;
//------------------------------
const int maxn = 25005;

int n, T;
struct node{
    int s,e;
    bool operator < (const node nt) const{
        return s < nt.s;
    }
}cow[maxn];
void init(){
    for(int i = 0; i < n; i++){
        scanf("%d%d",&cow[i].s,&cow[i].e);
    }
    sort(cow, cow + n);
}
void solve(){
    if(cow[0].s > 1){
        printf("-1\n");
        return;
    }

    int start_ = 1, end_ = 1, cnt = 1;
    for(int i = 0; i < n; i++){
        if(cow[i].s <= start_)
            end_ = max(end_, cow[i].e);
        else{
            cnt++;
            start_ = end_ + 1;
            if(cow[i].s <= start_) end_ = max(end_, cow[i].e);
            else{printf("-1\n"); return; }
        }
        if(end_ >= T) break;
    }
    if(end_ >= T)
        printf("%d\n",cnt);
    else printf("-1\n");
}
int main(){
    scanf("%d%d",&n,&T);
    init();
    solve();
    return 0;
}

竟错了一次T_T 因为solve函数中最后少判断了一个条件 end >= T......sigh...

时间: 2024-12-25 13:51:17

poj 2376 贪心 区间覆盖问题的相关文章

10382 - Watering Grass(贪心 区间覆盖问题)洒水面覆盖

double qiuzhi(int id) { double t1=cc[id].rid*cc[id].rid; double t2=w*w/4; double t3=t1-t2; double t4=sqrt(t3); return t4; } void to_qujian() { for(int i=0; i<t; i++) { double zhi=qiuzhi(i); qq[i].a=cc[i].pos-zhi; qq[i].b=cc[i].pos+zhi; } } 典型的贪心区间覆盖问

FZU 2144(几何+贪心区间覆盖)

题意:三维空间给出n个蚊子的初始位置(ax,ay,az)和移动趋势(dx,dy,dz),那么每个蚊子坐标随时间变化的函数就是(ax+dx*t, ay+dy*t, ax+dz*t).每次射杀一枪,可以把距离原点距离len之内的蚊子全部杀死.问最多能射杀几只蚊子,这时至少要射杀几次? 解法:先求出每只蚊子在射程之内的时间区间,即(ax+dx*t, ay+dy*t, ax+dz*t)^2<=len:解一元二次方程.如果两个解都小于0,则说明此蚊子不会被杀死.算出所有能被射杀的蚊子的时间区间以后就变成了

Cleaning Shifts(POJ 2376 贪心)

Cleaning Shifts Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 15143   Accepted: 3875 Description Farmer John is assigning some of his N (1 <= N <= 25,000) cows to do some cleaning chores around the barn. He always wants to have one co

贪心--区间覆盖及区间选点问题

区间覆盖: 数轴上有若干区间,选用最少的线段覆盖指定区间. 区间选点:选用最少的区间使每个区间内至少有一个点 样题1: J - Muddy roads Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Description Farmer John has a problem: the dirt road from his farm to town has suffered in the re

nyoj 12——喷水装置二——————【贪心-区间覆盖】

喷水装置(二) 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 有一块草坪,横向长w,纵向长为h,在它的橫向中心线上不同位置处装有n(n<=10000)个点状的喷水装置,每个喷水装置i喷水的效果是让以它为中心半径为Ri的圆都被润湿.请在给出的喷水装置中选择尽量少的喷水装置,把整个草坪全部润湿. 输入 第一行输入一个正整数N表示共有n次测试数据.每一组测试数据的第一行有三个整数n,w,h,n表示共有n个喷水装置,w表示草坪的横向长度,h表示草坪的纵向长度.随后的n行,

南阳OJ-12-喷水装置(二)贪心+区间覆盖

题目链接: http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=12 题目大意: 有一块草坪,横向长w,纵向长为h,在它的橫向中心线上不同位置处装有n(n<=10000)个点状的喷水装置,每个喷水装置i喷水的效果是让以它为中心半径为Ri的圆都被润湿.请在给出的喷水装置中选择尽量少的喷水装置,把整个草坪全部润湿. 传送门:喷水装置(一) 思路: 区间覆盖问题,每个点有一段喷水区间,按照左端点排序即可,设置两变量begin, end,依次扫过去,每

POJ 2376 (区间问题,贪心)

题目链接:http://poj.org/problem?id=2376 题目大意:选择一些区间使得能够覆盖1-T中的每一个点,并且区间数最少 题目分析:这道题目很明显可以用贪心法来解决.但题目没有看起来那么简单,有许多的坑. 我的贪心策略如下: 1.将区间按照起点排序,并且保证起点相同的,终点大的排在前边 2.在前一个选取的区间范围[L0,R0+1]中,选取起点在此范围但终点最靠右的一个区间 3.重复这个过程 另外,还有几点需要注意的地方: 1.要保证第一个区间起点和最后一个区间终点符合1-L的

三类贪心区间覆盖问题

一.区间完全覆盖问题 题目 给定一个长度为m的区间,再给出n条线段的起点和终点(注意这里是闭区间),求最少使用多少条线段可以将整个区间完全覆盖. 解析 先将所有线段按起点从小到大排序.排完序后,枚举每一个线段(被其它线段包含的线段不用考虑,因为很明显包含它的线段比它更优),将其作为最左端的线段, 再在剩下的左端点小于等于最左端的线段的右端点的线段中(若没有则无解),找到右端点最大的一个线段,即贪心,很显然这是最优的,因为其左端都被最左端的线段覆盖了, 也就没有覆盖到任何地方,则其右端点越大,其右

Cleaning Shifts (poj 2376 贪心)

Language: Default Cleaning Shifts Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 12111   Accepted: 3155 Description Farmer John is assigning some of his N (1 <= N <= 25,000) cows to do some cleaning chores around the barn. He always wa