码迷,mamicode.com
首页 > 其他好文 > 详细

POJ2376 Cleaning Shifts

时间:2017-01-18 00:40:24      阅读:245      评论:0      收藏:0      [点我收藏+]

标签:结束时间   iostream   开始时间   比较   stdin   步骤   选项   策略   lld   

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

类似于工作排序问题

贪心策略:在符合时间情况的选项中 选择结束时间最迟的牛

具体步骤:

按照开始时间升序排列  如果 开始时间相同 按照结束时间升序排列

设t为最终结束时间

区间[1, t]为最终区间

一次1 to n的循环 同时 扩大区间

最后比较t和T的值即可

 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <algorithm>
 4 
 5 using namespace std;
 6 
 7 typedef long long ll;
 8 ll T,N;
 9 struct Cow
10 {
11     ll st,ed;
12     bool operator < (Cow c) const//按照结束时间升序排列 重载操作符
13     {
14         return st < c.st;
15     }
16 }cow[25005];
17 
18 //贪心策略 在合适的工作时间内 选择结束时间最晚的
19 
20 int main()
21 {
22     freopen("in.txt", "r", stdin);
23     scanf("%lld%lld", &N, &T);
24     for (int i = 0; i < N; i++)
25     {
26         scanf("%lld%lld", &cow[i].st, &cow[i].ed);
27     }
28     //printf("%d\n", solve());
29     sort(cow, cow+N);
30     cow[N].st = 0x7fffffff;//因为后面要判断cow[i+1]
31     bool found = false;
32     ll t = 0, temp = 0;
33     int ans = 0;
34     for (int i = 0; i < N; i++)//这样只用找一遍即可,从小到大排列 不断的扩大t 扩大课工作时间的区间
35     {
36       //  found = false;
37         if (cow[i].st <= t + 1)
38         {
39             if(cow[i].ed > temp)
40             {
41                 temp = cow[i].ed;
42                 found = true;
43             }
44             if (cow[i+1].st > t+1 && found)//如果下一个 区间左端点 在t的右边 那么所找到的这个点是必然要要的
45             {
46                 t = temp;
47                 ans++;
48                 found = false;//t点更新 就去找下一个区间 这个之前放错了位置 每一次found都会改变t值
49             }
50         }
51     }
52     if (t<T) printf("-1\n"); else printf("%d\n",ans);
53     return 0;
54 }

 

POJ2376 Cleaning Shifts

标签:结束时间   iostream   开始时间   比较   stdin   步骤   选项   策略   lld   

原文地址:http://www.cnblogs.com/oscar-cnblogs/p/6295076.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!