我是靠谱客的博主 乐观爆米花,这篇文章主要介绍Rake It In,现在分享给大家,希望可以做个参考。

Rake It In

题意

给一个4×4矩阵。两个人选择一个2×2矩阵,第一个人每次都选择一个矩阵使得和的最终答案尽可能大,第二个人每次都选择一个矩阵使得和的最终答案尽可能小,每个人选择完之后该区域会进行一次逆时针90的翻转。

难点

自己刚做的时候以为是签到。。。
直接上来写了个翻转函数然后暴力求最大最小值,发现最后答案偏小了,才发现如果大小相等的情况下,选择不同的区域也跟后面的选择有关系,所以得用搜索,
才做过基础搜索的我碰到这个稍微难一点的就顶不住了。。也忘记回溯。。。。。反正就不说了 菜的抠脚

做法

暴力肯定还是暴力,因为数据很小的原因

每次都暴力进行一个区域的翻转,然后去BFS下一个人的操作,直至结束,然后回溯,把这个区域翻转回来,再进行别的区域的翻转,然后BFS下一个人…………

AC代码

复制代码
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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #include<string> #include<vector> #include<stack> #include<bitset> #include<cstdlib> #include<cmath> #include<set> #include<list> #include<deque> #include<queue> #include<map> #define ll long long #define pb push_back #define rep(x,a,b) for (int x=a;x<=b;x++) #define repp(x,a,b) for (int x=a;x<b;x++) #define W(x) printf("%dn",x) #define WW(x) printf("%lldn",x) #define pi 3.14159265358979323846 #define mem(a,x) memset(a,x,sizeof a) #define lson rt<<1,l,mid #define rson rt<<1|1,mid+1,r using namespace std; const int maxn=2e6+7; const int INF=1e9; const ll INFF=1e18; int a[7][7]; int k; void change(int i,int j) { int tmp=a[i][j]; a[i][j]=a[i][j+1]; a[i][j+1]=a[i+1][j+1]; a[i+1][j+1]=a[i+1][j]; a[i+1][j]=tmp; } void get_back(int i,int j) { int tmp=a[i][j]; a[i][j]=a[i+1][j]; a[i+1][j]=a[i+1][j+1]; a[i+1][j+1]=a[i][j+1]; a[i][j+1]=tmp; } int get_sum(int i,int j) { return a[i][j]+a[i+1][j]+a[i+1][j+1]+a[i][j+1]; } int dfs(int num) { if (num==2*k) //特判:最后一步比较特殊,就直接找最小值就可以了,也不用什么花里胡哨的了 { int ans=INF; rep(i,1,3) rep(j,1,3) ans=min(ans,get_sum(i,j)); return ans; } if (num%2==1) { int maxx=0; rep(i,1,3) { rep(j,1,3) { change(i,j); maxx=max(maxx,get_sum(i,j)+dfs(num+1)); get_back(i,j);//回溯 } } return maxx; } else if (num%2==0) { int minn=INF; rep(i,1,3) { rep(j,1,3) { change(i,j); minn=min(minn,get_sum(i,j)+dfs(num+1)); get_back(i,j);//回溯 } } return minn; } } int main() { int t; scanf("%d",&t); while(t--) { scanf("%d",&k); rep(i,1,4) rep(j,1,4) scanf("%d",&a[i][j]); W(dfs(1)); } return 0; }

最后

以上就是乐观爆米花最近收集整理的关于Rake It In的全部内容,更多相关Rake内容请搜索靠谱客的其他文章。

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

评论列表共有 0 条评论

立即
投稿
返回
顶部