C/C++知识点之poj 2376 Cleaning Shifts
小标 2018-08-10 来源 : 阅读 1085 评论 0

摘要:本文主要向大家介绍了C/C++知识点之poj 2376 Cleaning Shifts,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。

本文主要向大家介绍了C/C++知识点之poj 2376 Cleaning Shifts,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。


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 cow working on cleaning things up and has divided the day into T shifts (1 <= T <= 1,000,000), the first being shift 1 and the last being shift T. Each cow is only available at some interval of times during the day for work on cleaning. Any cow that is selected for cleaning duty will work for the entirety of her interval. Your job is to help Farmer John assign some cows to shifts so that (i) every shift has at least one cow assigned to it, and (ii) as few cows as possible are involved in cleaning. If it is not possible to assign a cow to each shift, print -1.
Input
* Line 1: Two space-separated integers: N and T * Lines 2..N+1: Each line contains the start and end times of the interval during which a cow can work. A cow starts work at the start time and finishes after the end time.
Output
* Line 1: The minimum number of cows Farmer John needs to hire or -1 if it is not possible to assign a cow to each shift.
Sample Input
3 10
1 7
3 6
6 10
Sample Output
2
Hint
This problem has huge input data,use scanf() instead of cin to read data to avoid time limit exceed. INPUT DETAILS: There are 3 cows and 10 shifts. Cow #1 can work shifts 1..7, cow #2 can work shifts 3..6, and cow #3 can work shifts 6..10. OUTPUT DETAILS: By selecting cows #1 and #3, all shifts are covered. There is no way to cover all the shifts using fewer than 2 cows.
Source
USACO 2004 December Silver
        贪心算法
题解:给定T个时间区间,区间范围[1,T],不同牛有不同的工作时间,求至少多少头牛工作可以覆盖这个区间。
       首先以牛开始工作的时间先后顺序排序,之后不断循环更新起点=终点+1,在开始工作时间能覆盖起点的牛中,每次选出一头工作时间最晚的牛,更新终点   
    具体AC代码:

#define _CRT_SECURE_NO_DEPRECATE
#include<iostream>
#include<algorithm>
using namespace std;
const int N_max = 25000;
pair<int, int>cows[N_max];
int N, T;
bool cmp(const pair<int, int>&a, const pair<int, int>&b) {
    return (a.first<b.first||(a.first==b.first&&a.second>b.second));
}
int solve() {
    int used_cows = 0;
    int end = 0, num = 0;
    while (end < T) {
        int begin = end + 1;//此时的end是上一头牛的工作结束时间,此时的begin为当前的牛工作开始时间要在begin之前
        for (int i = num;i < N;i++) {//选出新的一头牛,使得工作结束时间越晚越好
            if (cows[i].first <= begin) {
                if (cows[i].second >= begin)//别忘加等于,有可能牛的工作区间只有1个,譬如3-3
                    end = max(end, cows[i].second);//在能选的牛中选一条,使得工作的时间到最晚

            }
            else {
                num=i;//没有符合要求的牛可以挑选了,换新牛
                break;
            }
        }
        //判断这选出来的牛是否符合要求,即它的工作结束时间必须要大于begin,否则之间有区间不能被覆盖
        if (begin > end) {//此时begin是大于等于当前挑选出来的牛的开始时间,而end是当前牛的工作结束时间
            return -1;
        }
        else used_cows++;
    }
    return used_cows;
}
int main() {
    scanf("%d%d", &N, &T);
        for (int i = 0;i < N;i++)
        scanf("%d%d", &cows[i].first, &cows[i].second);
        sort(cows, cows + N,cmp);
        cout << solve() << endl;
    return 0;
}    

本文由职坐标整理并发布,了解更多内容,请关注职坐标编程语言C/C+频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程