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

CodeForces 520D 又见贪心

时间:2015-03-12 18:54:50      阅读:154      评论:0      收藏:0      [点我收藏+]

标签:

//贪心的做法比较明显:取出方格中的数从左往右排列形成一个 m 进制的数,前者想要数最大,则每次取符合条件的最大的数,后者想要数最小,则每次取符合条件的最小的数。

//做法也比较暴力:在整个剩余的数形成的集合中两人每次贪心取数,那么就相当于是对剩余的数形成的集合进行搜索,考虑到极端情况:集合里面有很多数,但是只有一个可以取,这时通过加强集合元素的条件(是剩余的数 && (之前能被取出 || 现在能被取出))来缩小集合的大小,但是在数被取出之后需要对集合进行维护(添加元素)

//之前感觉写起来挺麻烦,就一直没动手去写,没想到今天写完交上去就过了......

 1 #include "iostream"
 2 #include "cstdio"
 3 #include "cstring"
 4 #include "algorithm"
 5 #include "utility"
 6 #include "set"
 7 #include "map"
 8 using namespace std;
 9 const int mod = 1e9 + 9;
10 int m;
11 int x[100010], y[100010];
12 set<int> s;
13 bool vis[100010];
14 map<pair<int, int>, int> mp;
15 bool available(int index)
16 {
17     int X = x[index], Y = y[index];
18     pair<int, int> point = make_pair(X, Y), pre, next;
19     bool no;
20     int i, j;
21     for(i = 1, pre = make_pair(X - 1, Y + 1); i <= 3; ++i, ++pre.first) {
22         if(!mp[pre])
23             continue;
24         no = 1;
25         for(j = 1, next = make_pair(pre.first - 1, pre.second - 1); j <= 3; ++j, ++next.first) {
26             if(mp[next] && next != point) {
27                 no = 0;
28                 break;
29             }
30         }
31         if(no)
32             return 0;
33     }
34     return 1;
35 }
36 
37 void res_add(__int64 &res, int v)
38 {
39     res = (res * m) % mod;
40     res = (res + v) % mod;
41 }
42 
43 void cube_add(int index)
44 {
45     int i;
46     pair<int, int> next;
47     int tmp;
48     for(i = 1, next = make_pair(x[index] - 1, y[index] - 1); i <= 3; ++i, ++next.first) {
49         tmp = mp[next];
50         if(!tmp)
51             continue;
52         --tmp;
53         if(available(tmp)) {
54 //            printf("add_cube index == %d  next == %d\n", index, tmp);
55 //            printf("%d %d\n", next.first, next.second);
56             s.insert(tmp);
57         }
58 
59     }
60 }
61 
62 int main()
63 {
64     int i;
65     scanf("%d", &m);
66     for(i = 0; i <= m - 1; ++i) {
67         scanf("%d%d", &x[i], &y[i]);
68         mp[make_pair(x[i], y[i])] = i + 1;
69     }
70     for(i = 0; i <= m - 1; ++i) {
71         if(available(i)) {
72             s.insert(i);
73 //            printf("ava == %d\n", i);
74         }
75     }
76     int tmp;
77     __int64 res = 0;
78     for(i = 1; i <= m; ++i) {
79         while(!s.empty()) {
80             if(i & 1)
81                 tmp = *s.rbegin();
82             else
83                 tmp = *s.begin();
84 //            printf("chi == %d\n", tmp);
85             s.erase(tmp);
86             if(available(tmp)) {
87                 res_add(res, tmp);
88                 mp.erase(make_pair(x[tmp], y[tmp]));
89                 cube_add(tmp);
90                 break;
91             }
92         }
93     }
94     printf("%I64d\n", res);
95 }

 

CodeForces 520D 又见贪心

标签:

原文地址:http://www.cnblogs.com/AC-Phoenix/p/4333197.html

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