2022.10.12 整理

本文最后更新于:2022年10月27日 晚上

问题

基础的二分答案掌握尚不牢固(太丢人了)。

实际问题考虑不周全(更丢人了,甚至不和 0 取 $\max​$)。

码力还是不够强,斗地主没两个月就写不出来了(更进一步的丢人了)。

DP 还是弄不出来,还是得练。

Solution

P2678

这居然还不能全对着实丢大人了。

具体错误:

上来没有快速排序,石头的位置并不是有序的!

check 函数中判断石头挪走后,没有正确处理该和哪一个石头对比距离,应当是沿用之前的石头而不是上一个石头。

为什么上来要拿走当前的石头呢?因为拿走靠后一点的会给后面的留下更多选择的余地,这样比拿走上一个肯定更好一点,至少不会亏本。

1
2
3
4
5
6
7
8
9
10
11
bool check(ll x) {
int now = 0, pos = 0, tot = 0; // pos 为上一个石头的位置

while(now < n + 1) {
++now;
if(a[now] - a[pos] < x) ++tot; // 不满足了,拿走当前的石头而保留上一个石头
else pos = now; // 如果满足条件那就看下一个距离
}

return tot <= m;
}

P2668

总而言之还是多写几遍吧,码力还是不够强。

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
107
108
109
110
111
void dfs(int x) {
if(x >= ans) return ;

int len = 0; // 搜索单顺子
for(int i = 3; i <= 14; ++i) {
if(a[i] == 0) len = 0; // 顺子断掉了就把长度减掉
else {
++len; // 累计长度
if(len >= 5) { // 满足发动条件
for(int j = i; j >= i - len + 1; --j) --a[j];
dfs(x + 1);
for(int j = i; j >= i - len + 1; --j) ++a[j];
}
}
}

len = 0; // 注意初始化
for(int i = 3; i <= 14; ++i) {
if(a[i] < 2) len = 0;
else {
++len;
if(len >= 3) { // 开双顺子
for(int j = i; j >= i - len + 1; --j) a[j] -= 2;
dfs(x + 1);
for(int j = i; j >= i - len + 1; --j) a[j] += 2;
}
}
}

len = 0;
for(int i = 3; i <= 14; ++i) {
if(a[i] < 3) len = 0;
else {
++len;
if(len >= 2) {
for(int j = i; j >= i - len + 1; --j) a[j] -= 3;
dfs(x + 1);
for(int j = i; j >= i - len + 1; --j) a[j] += 3;
}
}
}

for(int i = 2; i <= 14; ++i) {
if(a[i] <= 3) {
if(a[i] <= 2) continue;
a[i] -= 3;
for(int j = 2; j <= 15; ++j) {
if(a[j] <= 0 || j == i) continue;
--a[j];
dfs(x + 1);
++a[j];
}

for(int j = 2; j <= 14; ++j) {
if(a[j] < 2 || j == i) continue;
a[j] -= 2;
dfs(x + 1);
a[j] += 2;
}

a[i] += 3;
} else {
a[i] -= 3;
for(int j = 2; j <= 15; ++j) {
if(a[j] < 1 || j == i) continue;
--a[j];
dfs(x + 1);
++a[j];
}
for(int j = 2; j <= 14; ++j) {
if(a[j] < 2 || j == i) continue;
a[j] -= 2;
dfs(x + 1);
a[j] += 2;
}
a[i] += 3;

a[i] -= 4;
for(int j = 2; j <= 15; ++j) {
if(a[j] <= 0 || j == i) continue;
--a[j];
for(int k = 2; k <= 15; ++k) {
if(a[k] <= 0 || j == k) continue;
--a[k];
dfs(x + 1);
++a[k];
}
++a[j];
}

for(int j = 2; j <= 14; ++j) {
if(a[j] < 2 || j == i) continue;
a[j] -= 2;
for(int k = 2; k <= 14; ++k) {
if(a[k] < 2 || k == j) continue;
a[k] -= 2;
dfs(x + 1);
a[k] += 2;
}
a[j] += 2;
}

a[i] += 4;
}
}

for(int i = 2; i <= 15; ++i)
if(a[i]) ++x;

ans = min(ans, x);
}

2022.10.12 整理
http://dxrprime.github.io/2022/10/14/2022.10.12整理/
作者
Shelter Prime
发布于
2022年10月14日
许可协议