首页 > 其他 > 详细

bzoj 1293: [SCOI2009]生日礼物

时间:2014-01-21 16:34:35      阅读:342      评论:0      收藏:0      [点我收藏+]

枚举每一个位置找出每一种颜色在这个位置之后的第一个位置与这个位置距离的最大值,再找出每一个位置结果的最小值就可以啦。

用堆来处理这个问题是不错的想法

bubuko.com,布布扣
 1 #include <queue>
 2 #include <cstdio>
 3 #include <algorithm>
 4 #include <iostream>
 5 #include <functional>
 6 using namespace std;
 7 #define N 1000008
 8 #define K 68
 9 
10 int n,k,ans = 2147483647;
11 
12 priority_queue<int,vector<int>,greater<int> > que[K];
13 
14 void init()
15 {
16     scanf("%d%d",&n,&k);
17     for (int i = 1;i <= k;i++)
18     {
19         int num,a;
20         scanf("%d",&num);
21         while (num--)
22         {
23             scanf("%d",&a);
24             que[i].push(a);
25             que[0].push(a);
26         }
27     }
28 }
29 
30 void debug()
31 {
32     for (int i = 1;i <= k;i++)
33     {
34         while (!que[i].empty())
35         {
36             printf("%d ",que[i].top());
37             que[i].pop();
38         }
39         printf("\n");
40     }
41 }
42 
43 void work()
44 {
45     while (!que[0].empty())
46     {
47         int u = que[0].top(),m = 0;
48         for (int i = 1;i <= k;i++)
49         {
50             while (que[i].top() < u && !que[i].empty()) que[i].pop();
51             if (que[i].empty()) return ;
52             m = max(m,que[i].top() - u);
53         }
54         ans = min(m,ans);
55         que[0].pop();
56     }
57 }
58 
59 int main()
60 {
61     init();
62 //    debug();
63     work();
64     printf("%d\n",ans);
65     return 0;
66 }
View Code

bzoj 1293: [SCOI2009]生日礼物

原文:http://www.cnblogs.com/wulala979/p/3527255.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!