首页 > 代码库 > POJ2376 Cleaning Shifts

POJ2376 Cleaning Shifts

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