我是靠谱客的博主 优雅芒果,这篇文章主要介绍2017 ICPC 南宁 区域赛 I Rake It In,现在分享给大家,希望可以做个参考。

题目链接:

点击打开链接


题意描述:

Alice和Bob在玩一种名为“Rake It In”的游戏,起初有一个4*4的棋盘,每一格为一个1~10的整数,两人轮流行动,各自k次,行动者选择棋盘中某一个2*2的区域,将这四个元素求和,加到最终答案中,并将四个元素按逆时针旋转90度,Alice先行。Alice的目标是最大化最后的答案,Bob相反。请写一个程序计算,在两人都最聪明的情况下,最终答案为多少。


解题思路:

对于每一次旋转或者求和,在4*4的棋盘下选出2*2的区域总共只有9种。

由于k<=3,t<=200,可以想到,在最坏的情况下,暴力计算出每一层的最优解,一共也只有6层,时间最多为200*(9^6)。

因此采用贪心+暴力DFS的方法,暴力递归出每一层的最优解,进而求取最终答案,代码如下:


复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#include<cstdio> #include<iostream> using namespace std; #define INF 0x3f3f3f3f int a[5][5]; int k; int cal(int t) { int i = (t+2)/3; int j = (t-1)%3+1; return a[i][j] + a[i+1][j] + a[i][j+1] + a[i+1][j+1]; } void rotat(int t) { int i = (t+2)/3; int j = (t-1)%3+1; int a1 = a[i][j]; int a2 = a[i+1][j]; int a3 = a[i][j+1]; int a4 = a[i+1][j+1]; a[i][j] = a3; a[i+1][j] = a1; a[i+1][j+1] = a2; a[i][j+1] = a4; } void rerotat(int t) { int i = (t+2)/3; int j = (t-1)%3+1; int a1 = a[i][j]; int a2 = a[i+1][j]; int a3 = a[i][j+1]; int a4 = a[i+1][j+1]; a[i][j] = a2; a[i+1][j] = a4; a[i+1][j+1] = a3; a[i][j+1] = a1; } int dfs(int t) { if(t == 2*k) { int ans = INF; for(int i=1; i<=9; i++) ans = min(ans, cal(i)); return ans; } else if(t%2 == 0) { int ans = INF; for(int i=1; i<=9; i++) { rotat(i); int temp = dfs(t+1); ans = min(ans, temp+cal(i)); rerotat(i); } return ans; } else { int ans = 0; for(int i=1; i<=9; i++) { rotat(i); int temp = dfs(t+1); ans = max(ans, temp+cal(i)); rerotat(i); } return ans; } } int main() { int T; scanf("%d", &T); while(T--) { scanf("%d", &k); for(int i=1; i<=4; i++) for(int j=1; j<=4; j++) scanf("%d", &a[i][j]); printf("%dn", dfs(1)); } return 0; }


最后

以上就是优雅芒果最近收集整理的关于2017 ICPC 南宁 区域赛 I Rake It In的全部内容,更多相关2017内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(79)

评论列表共有 0 条评论

立即
投稿
返回
顶部