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

POJ 2376 Cleaning Shifts

时间:2015-08-18 19:02:00      阅读:157      评论:0      收藏:0      [点我收藏+]

标签:

POJ 2376 Cleaning Shifts

给定N个小区间以及区间起点终点,求能用它们覆盖区间[1,T]的最小组合。

贪心策略:从左到右,按各种牛开始的时刻排序。一开始设终点是0,起点是终点+1,搜索能覆盖起点并到达最远的牛,一直循环知道N。

贪心法就是不断的求局部最优解。大多数情况下,排序是很重要的。

 1 #include<iostream>
 2 #include<algorithm>
 3 using namespace std;
 4 const int MAX_COW=25000;
 5 int N,T;
 6 struct Cow{
 7     int begin,end;
 8 };
 9 Cow cow[MAX_COW];
10 //对于自定义结构的排序方法 
11 bool is_greater(const Cow& a, const Cow& b)
12 {
13     //按开始的时间排序,如果,这个如果很重要,开始时间相同再按结束时间排序 
14     return ( a.begin<b.begin || (a.begin==b.begin && a.end>b.end) );
15 }
16 int solve()
17 {
18     int used_cow=0;
19     //设置下标,避免重复搜索 
20     int index=0;
21     int end=0;
22     while(end<T)
23     {
24         //更新起点 
25         int begin=end+1;
26         for(int i=index;i<N;i++)
27         {
28             if(cow[i].begin<=begin)
29             {
30                 if(cow[i].end>=begin)
31                 {
32                     //符合条件后立即更新终点,寻求局部最优解 
33                     end=max(end,cow[i].end);
34                 }
35             }
36             //不符合时记录下标并停止内部循环,用于下次查找 
37             else
38             {
39                 index=i;
40                 break;
41             }
42         }
43         //如果找不到这样的牛就直接洗剪吹 
44         if(begin>end)
45         {
46             return -1;
47         }
48         else
49         {
50             used_cow++;
51         }
52     }
53     return used_cow;
54 }
55 int main()
56 {
57     cin>>N>>T;
58     for(int i=0;i<N;i++)
59     {
60         cin>>cow[i].begin>>cow[i].end;
61     }
62     sort(cow,cow+N,is_greater);
63     cout<<solve()<<endl;
64     return 0;
65 }

 

POJ 2376 Cleaning Shifts

标签:

原文地址:http://www.cnblogs.com/xlsryj/p/4739875.html

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