ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#437 | #69. 「NOIP2015」斗地主 | Pigsyy | 100 | 34ms | 1916kb | C++23 | 3.6kb | 2025-04-24 13:26:43 | 2025-04-24 13:26:44 |
answer
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = 25;
int T, n, ans;
int cards[maxn];//cards[i]表示i牌有cards[i]张.
int GetAns() {
int cnt = 0, c[maxn] = {0}; //cnt用来统计带牌的步数,c[i]表示有c[i]个张数为i的牌.
for (int i = 0; i <= 13; i++)
c[cards[i]]++;//统计张数为1,2,3,4的牌的个数.
while (c[4] && c[2] >= 2)
c[4] -= 1, c[2] -= 2, cnt++; //四带二(两个对子).
while (c[4] && c[1] >= 2)
c[4] -= 1, c[1] -= 2, cnt++; //四带二(两张单牌).
while (c[4] && c[2])
c[4] -= 1, c[2] -= 1, cnt++; //四带二(一个对子看做两张单牌).
while (c[3] && c[2])
c[3] -= 1, c[2] -= 1, cnt++; //三带一(一个对子).
while (c[3] && c[1])
c[3] -= 1, c[1] -= 1, cnt++; //三带一(一张单牌).
return cnt + c[4] + c[3] + c[2] + c[1]; //输出贪心所需要的步骤(带牌+炸弹+三张+对子+单牌).
}
void DFS(int depth) {
if (depth > ans)
return ;//剪枝一————当前步数大于答案.
int t = GetAns(); //贪心带牌(剪枝二).
if (depth + t < ans)
ans = depth + t; //当前步数+贪心带牌的步数比答案更优.
//接下来考虑出顺子以减少步数.
for (int i = 2; i <= 13; i++) { //三顺.
int pos = i;
while (cards[pos] >= 3)
pos++;//pos表示能连续的三张的最后一张.
if (pos - i >= 2) { //如果连续三张的长度大于2(能成顺).
for (int j = i + 1; j <= pos - 1; j++) {
for (int k = i; k <= j; k++)
cards[k] -= 3; //出三顺,更新牌数.
DFS(depth + 1); //进一步搜索.
for (int k = i; k <= j; k++)
cards[k] += 3; //搜索结束,复原牌数.
}
}
}
for (int i = 2; i <= 13; i++) { //双顺.
int pos = i;
while (cards[pos] >= 2)
pos++;//pos表示能连续的两张的最后一张.
if (pos - i >= 3) { //如果连续两张的长度大于3(能成顺).
for (int j = i + 2; j <= pos - 1; j++) {
for (int k = i; k <= j; k++)
cards[k] -= 2; //出双顺,更新牌数.
DFS(depth + 1); //进一步搜索.
for (int k = i; k <= j; k++)
cards[k] += 2; //搜索结束,复原牌数.
}
}
}
for (int i = 2; i <= 13; i++) { //单顺.
int pos = i;
while (cards[pos] >= 1)
pos++;//pos表示能连续的单张的最后一张.
if (pos - i >= 5) { //如果连续两张的长度大于5(能成顺).
for (int j = i + 4; j <= pos - 1; j++) {
for (int k = i; k <= j; k++)
cards[k] -= 1; //出单顺,更新牌数.
DFS(depth + 1); //进一步搜索.
for (int k = i; k <= j; k++)
cards[k] += 1; //搜索结束,复原牌数.
}
}
}
}
int main() {
// freopen("landlords.in","r",stdin);
// freopen("landlords.out","w",stdout);
scanf("%d%d", &T, &n);
while (T--) {
//初始化.
memset(cards, 0, sizeof(cards));
ans = 0x7fffffff;
for (int i = 1, x, color; i <= n; i++) {
scanf("%d%d", &x, &color);
if (x == 1)
x = 13; //特殊处理A.
else if (x)
x--;
cards[x]++;//统计牌.
}
DFS(0);
printf("%d\n", ans);
}
return 0;
}
详细
小提示:点击横条可展开更详细的信息
Test #1:
score: 5
Accepted
time: 1ms
memory: 1916kb
input:
100 2 13 2 9 3 3 2 9 1 6 4 6 3 1 3 6 4 9 3 8 2 8 3 7 4 8 4 10 4 3 3 5 3 4 3 6 2 5 1 12 3 11 3 12 4 1...
output:
2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 ...
result:
ok 100 tokens
Test #2:
score: 5
Accepted
time: 2ms
memory: 1852kb
input:
100 2 9 3 11 4 6 2 6 4 11 1 4 2 4 3 7 3 11 3 5 3 5 3 13 2 4 3 6 1 8 3 1 4 6 3 8 3 9 1 2 3 0 1 12 2 4...
output:
2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 ...
result:
ok 100 tokens
Test #3:
score: 5
Accepted
time: 2ms
memory: 1860kb
input:
100 3 2 2 9 4 13 4 2 4 11 3 7 3 12 4 2 4 7 1 0 1 3 3 5 4 2 3 9 1 11 2 0 1 10 1 9 4 0 2 8 3 6 3 5 3 6...
output:
3 3 3 3 3 3 3 3 3 2 3 3 2 3 3 2 3 3 3 3 2 2 3 3 2 3 3 3 3 3 3 3 2 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 ...
result:
ok 100 tokens
Test #4:
score: 5
Accepted
time: 2ms
memory: 1852kb
input:
100 3 10 1 6 1 12 3 5 2 1 1 11 3 8 4 7 4 7 3 4 3 9 3 10 2 9 1 12 1 4 2 7 3 6 3 4 2 5 4 13 1 7 4 7 1 ...
output:
3 3 2 3 3 3 3 3 2 3 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 2 3 3 3 3 3 3 3 3 3 3 2 3 ...
result:
ok 100 tokens
Test #5:
score: 5
Accepted
time: 2ms
memory: 1704kb
input:
100 4 8 4 9 2 12 4 2 1 12 3 6 3 7 2 5 2 10 4 9 4 7 4 12 4 5 3 10 3 1 2 10 2 12 1 2 3 13 1 3 3 1 3 13...
output:
4 4 4 3 4 4 4 4 4 4 3 3 4 4 4 3 3 4 4 4 4 4 3 4 4 4 4 4 3 4 4 4 4 3 3 4 3 4 4 3 3 4 4 3 4 3 4 4 3 4 ...
result:
ok 100 tokens
Test #6:
score: 5
Accepted
time: 1ms
memory: 1908kb
input:
100 4 9 2 6 1 9 4 8 3 7 2 12 2 11 3 5 1 9 4 1 3 3 4 9 1 3 1 8 1 11 3 10 4 2 1 9 2 10 1 5 2 13 2 6 3 ...
output:
3 4 3 4 4 4 4 2 4 3 4 4 3 4 3 4 4 4 4 4 4 3 4 3 3 3 4 4 4 3 4 3 4 4 4 4 4 3 4 3 3 3 4 4 4 4 3 4 4 4 ...
result:
ok 100 tokens
Test #7:
score: 5
Accepted
time: 2ms
memory: 1700kb
input:
100 10 7 3 8 1 4 1 11 2 5 2 7 2 6 1 2 1 4 2 11 4 13 1 10 3 11 1 7 3 1 4 5 4 3 1 7 4 8 4 10 1 2 3 10 ...
output:
5 8 6 5 4 7 8 9 7 6 6 7 7 5 9 8 8 7 8 3 9 7 7 9 9 7 8 7 2 6 5 9 5 7 5 5 9 9 8 8 4 6 4 6 5 8 8 7 6 7 ...
result:
ok 100 tokens
Test #8:
score: 5
Accepted
time: 2ms
memory: 1860kb
input:
100 11 6 3 3 3 1 1 8 1 3 4 12 1 5 2 2 1 0 2 11 4 11 2 1 1 6 3 7 1 9 4 4 2 3 3 5 1 11 3 10 4 7 3 0 1 ...
output:
9 7 8 6 7 9 7 6 9 9 8 8 7 6 9 7 9 7 8 8 6 9 5 7 6 8 9 6 7 10 8 5 6 9 5 8 6 9 5 8 7 7 6 8 5 3 9 9 8 6...
result:
ok 100 tokens
Test #9:
score: 5
Accepted
time: 2ms
memory: 1816kb
input:
100 12 11 1 3 1 8 2 12 4 7 2 4 2 13 2 9 4 4 3 6 4 13 3 4 1 5 2 1 4 8 3 9 1 10 2 6 4 2 4 9 2 10 3 9 3...
output:
8 6 8 6 9 7 8 5 8 8 9 9 7 8 8 7 7 9 7 9 10 7 7 7 8 7 9 7 6 9 8 10 9 8 6 8 7 5 8 6 8 6 7 7 6 6 8 8 9 ...
result:
ok 100 tokens
Test #10:
score: 5
Accepted
time: 1ms
memory: 1912kb
input:
100 13 12 2 2 1 11 2 11 4 12 3 0 2 11 1 9 2 7 2 7 3 7 4 9 1 1 1 4 4 10 2 11 3 5 4 9 4 9 2 13 4 11 4 ...
output:
5 5 11 8 5 2 7 10 5 8 8 7 10 8 9 10 6 7 7 6 8 7 8 10 5 6 6 8 10 10 9 7 6 7 5 6 5 8 8 6 3 5 3 11 8 8 ...
result:
ok 100 tokens
Test #11:
score: 5
Accepted
time: 2ms
memory: 1704kb
input:
100 14 13 3 5 3 10 1 5 4 7 4 5 2 12 1 6 3 10 2 9 1 0 2 9 4 1 2 6 1 6 4 12 4 7 2 9 4 13 2 13 3 9 3 5 ...
output:
8 9 10 7 9 9 6 7 8 9 8 8 8 7 6 7 9 9 7 10 6 6 9 5 5 7 5 6 6 4 4 7 5 10 9 9 9 10 7 8 7 7 7 8 6 9 5 5 ...
result:
ok 100 tokens
Test #12:
score: 5
Accepted
time: 2ms
memory: 1768kb
input:
100 15 1 1 1 2 8 4 3 2 6 4 2 4 7 3 12 4 4 2 9 3 7 2 9 1 13 2 3 3 13 1 9 2 8 2 11 2 1 4 4 1 11 4 1 3 ...
output:
10 9 8 8 6 10 7 6 10 8 6 5 7 5 5 11 8 10 7 7 9 10 6 9 6 10 6 7 7 8 9 8 8 5 8 9 6 4 5 9 7 5 8 7 6 7 4...
result:
ok 100 tokens
Test #13:
score: 5
Accepted
time: 1ms
memory: 1700kb
input:
10 16 1 4 12 2 10 2 2 2 4 3 8 2 3 4 0 2 10 1 8 1 13 1 12 4 8 3 10 3 7 2 3 2 1 2 5 4 4 2 1 3 2 1 6 1 ...
output:
8 8 8 8 6 10 7 4 5 8
result:
ok 10 tokens
Test #14:
score: 5
Accepted
time: 1ms
memory: 1912kb
input:
10 17 4 4 9 2 0 2 1 1 7 4 7 1 8 4 1 3 6 4 11 4 2 1 3 2 6 3 5 3 11 2 10 2 13 3 7 4 9 1 12 4 4 3 13 4 ...
output:
7 7 6 10 8 9 8 6 6 8
result:
ok 10 tokens
Test #15:
score: 5
Accepted
time: 1ms
memory: 1912kb
input:
10 18 2 2 12 4 8 4 3 2 1 2 0 1 6 4 2 4 13 4 4 4 8 2 5 4 13 3 13 2 7 4 13 1 1 1 9 3 8 1 13 4 3 1 2 3 ...
output:
5 9 8 6 6 8 9 5 10 9
result:
ok 10 tokens
Test #16:
score: 5
Accepted
time: 2ms
memory: 1812kb
input:
10 19 12 2 8 1 12 4 3 2 7 4 3 3 1 1 4 2 5 4 2 4 10 2 2 1 11 4 4 1 6 1 7 3 6 3 9 2 3 4 12 4 0 1 5 1 9...
output:
7 9 8 11 7 6 7 8 6 9
result:
ok 10 tokens
Test #17:
score: 5
Accepted
time: 2ms
memory: 1828kb
input:
10 20 7 1 3 4 0 2 1 3 9 2 12 1 12 2 11 4 10 4 13 2 1 4 10 1 5 4 13 1 9 1 4 4 5 1 7 2 7 4 9 3 6 2 0 1...
output:
7 8 9 9 6 4 6 6 5 5
result:
ok 10 tokens
Test #18:
score: 5
Accepted
time: 2ms
memory: 1828kb
input:
10 21 6 3 1 4 3 4 10 2 12 4 11 1 2 2 4 2 11 2 3 1 8 1 12 2 2 1 7 4 9 1 11 4 2 4 1 3 11 3 12 3 10 4 1...
output:
4 8 5 10 6 8 8 8 5 4
result:
ok 10 tokens
Test #19:
score: 5
Accepted
time: 2ms
memory: 1908kb
input:
10 22 4 3 7 1 10 2 2 1 13 1 6 1 5 3 10 3 12 3 4 4 1 4 7 4 3 3 0 1 1 3 3 4 9 3 7 2 7 3 8 4 1 1 9 2 0 ...
output:
9 9 8 9 9 8 7 6 6 9
result:
ok 10 tokens
Test #20:
score: 5
Accepted
time: 2ms
memory: 1852kb
input:
10 23 9 2 2 3 9 1 10 3 8 1 3 2 9 4 6 4 4 4 7 2 3 4 7 1 12 3 7 3 10 1 6 3 2 4 11 2 4 3 2 1 4 2 1 4 8 ...
output:
6 6 6 5 7 8 5 6 9 5
result:
ok 10 tokens