Logo Wy Online Judge

WyOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#437#69. 「NOIP2015」斗地主Pigsyy10034ms1916kbC++233.6kb2025-04-24 13:26:432025-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;
}

Details

小提示:点击横条可展开更详细的信息

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