zoukankan      html  css  js  c++  java
  • 贪心问题:区间覆盖 POJ 2376 Cleaning Shift

    题目:http://poj.org/problem?id=2376

    题意:就是 N 个区间, 输入 N 个区间的 [begin, end],求能用它们覆盖区间[1,T]的最小组合。

    题解:

    1. 首先对所有奶牛的排序,按照开始时间升序排序。

    2. 更新 起点 为 上一次的终点 + 1,并寻找覆盖起点,且终点最远的区间

    #include <iostream>
    #include <cstdlib>
    #include <cstdio>
    #include <algorithm>
    using namespace std;
    
    const int maxn = 25000 + 50;
    typedef long long LL;
    
    int N;
    LL T;
    
    struct Works {
        int start,
            end;
        Works(int s = 0, int e = 0) : start(s), end(e) {}
    } works[maxn];
    
    bool cmp(const Works& a, const Works& b)
    {
        return a.start < b.start || (a.start == b.start && a.end > b.end);
    }
    
    void solve()
    {
        cin >> N >> T;
        
        for (int i = 0; i < N; i++)
        {
            scanf("%d%d", &works[i].start, &works[i].end);
        }
        
        sort(works, works + N, cmp);
        
        int ans = 0;
        int current_sum = 0;
        bool flag = true;
        while (current_sum < T)
        {
            int begin = current_sum + 1;
                    
            for (int i = 0; i < N; i++)
            {
                //寻找能够能覆盖起点的牛 
                if (works[i].start <= begin) {
                    //是否能覆盖起点 
                    if (works[i].end >= begin) {
                        //寻找 最远的 终点
                        current_sum = max(current_sum, works[i].end); 
                    }
                }
            }
            //没有找到这样的牛
            if (begin > current_sum) {
                flag = false;
                break;
            }
            else {
                ans++;
            }
        }
        if (flag) {
            printf("%d
    ", ans);
        } else {
            printf("-1
    ");
        }
    }
    
    int main()
    {
        solve();
        return 0;
    }
  • 相关阅读:
    只是记录一些东西在上面,不是为了炫耀,也不是为了。。。。
    之友赠言
    登陆名---惊涛骇浪
    JNI
    学长们的求职血泪史(C/C++/JAVA)
    胡震宁先生的《职业生涯规划》
    大小端地址转换
    关于Android不能启动的问题
    编译Android 必须安装的库
    ubuntu11.10 64bit 编译android 4.0
  • 原文地址:https://www.cnblogs.com/douzujun/p/8480817.html
Copyright © 2011-2022 走看看