Logo huzhenyuan的博客

博客

*蓝桥

2025-08-10 16:06:48 By huzhenyuan

蓝桥杯

今天不是打蓝桥杯吗,我打完后才发现比赛须知里说在比赛前会跳出一个“分享”的窗口,但是我没跳!!

还有最后忘点“提交该子卷”了,不会算没提交0分吧……(350分,我总分好像是277,因为最后的出栈方法数没写AC,只有27分……)

(其实我并没有把比赛须知读完,后悔了q_q)

编程6道题,但只记得后3:

T4

前言

大概就是矩阵旋转,不过要分层,example:

1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16

变成↓

13 9 5 1
14 7 11 2
15 6 10 3
16 12 8 4

题目中说是分层,其实就是由外到内每一圈都换个方向转

例如$n = 4$的矩阵旋转方向be like:

─ ─ ─ ┐
↑ ┌ ─ │
│ └ ↑ │
└ ─ ─ ┘

最外圈顺时针,第二圈逆时针,以此类推。

其实和矩阵旋转差不多


输入格式

第$1$行一个整数$n$,表示矩阵的行数及列数

第$2$到$n + 1$行,每行$n$个整数,表示矩阵当前行的$n$个整数


输出格式

输出共$n$行

第$i$行输出旋转后矩阵的第$i$行的$n$个整数


样例数据

input

4
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16

output

13 9 5 1
14 7 11 2
15 6 10 3
16 12 8 4

数据范围

$1$ <= $n$ <= $100$


我的程序:(回忆)

这题我AC

#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
    int n;
    cin >> n;
    int a[n][n];
    for(int i = 0; i < n; i++)
        for(int j = 0; j < n; j++)
            cin >> a[i][j];
    for(int i = 0; i < n; i++)
    {
        for(int j = 0; j < n; j++)
        {
            int greater = max(i, n- i - 1), lesser = min(i, n - i - 1);
            bool flag = (j >= lesser ? j <= greater ? lesser : n - j - 1 : j) & 1 ^ 1;
            cout << (a[flag ? n - j - 1 : j][flag ? i : n - i - 1]) << ' ';
        }
        cout << '\n';
    }
    return 0;
}

T5

前言

最优策略

说Jerry和Tom (为什么是猫和老鼠???) 在玩卡牌,两人 (动物) 都很聪明,想让自己赢

每人 (动物) 都轮流在n个盒子里拿至少1张牌,哪个人 (动物) 当前摸的盒子里没有牌(拿不上牌)了,哪个人 (动物) 就输了

如果任何人 (动物) 在第n个盒子里拿了牌,则下一个人 (动物) 就需要在第1个盒子里拿(就是循环拿)

第一次由Jerry先拿,接下来两人轮流拿

现在问你,哪个人 (动物) 会赢?

数据很大,还多组,所以只能O(n)(输入)

可以分两种情况:

  • ① n为奇数

    这时Jerry必赢,因为第二次循环时Tom在上一次Jerry拿过的盒子拿,只要Jerry把第一个盒子里的牌拿完,Tom必输

  • ② n为偶数

    这时Jerry和Tom都可能赢,每个人 (动物) 在循环中都会在自己上一次循环拿过的盒子里拿牌,最好的方法当然是每次只拿一张牌

    那此时问题就变为了谁的牌最少的盒子里的牌比另一个人 (动物) 的牌最少的盒子里的牌少,谁就输了……

    吗?

    如果每个人 (动物) 的牌最少的盒子里的牌数正好相同呢?

    那么谁的牌最少的盒子靠前,谁就输了

    总结起来就是此时谁的牌最少的盒子里的牌少或者两人 (动物) 牌最少的盒子里的牌数相等时,谁的牌最少的盒子靠前,谁就输了

    反过来,那另一个人 (动物) 就赢了


输入格式

第$1$行一个整数$t$,表示有$t$组测试数据

接下来依次输入$t$组测试样例

每组测试样例共$2$行

第$1$行输入一个整数$n$,表示有$n$个盒子

第$2$行输入$n$个整数,第$i$个数表示第$i$个盒子里的牌数


输出格式

输出共$t$行

第$i$行为一个字符串"Jerry"或"Tom",表示第$i$组测试样例中赢的人的名字


样例数据

input

2
1
1
2
30 50

output

Jerry
Tom

我的程序

AC

#include <iostream>
using namespace std;
int main()
{
    int t;
    cin >> t;
    while(t-- > 0)
    {
        int n;
        cin >> n;
        int minj = 1e9 + 1, mint = 1e9 + 1, tminj, tmint;
        for(int i = 0; i < n; i++)
        {
            int a;
            cin >> a;
            if(i & 1 && a < mint)
            {
                mint = a;
                tmint = i;
            }
            else if(a < minj)
            {
                minj = a;
                tminj = i;
            }
        }
        cout << (n & 1 || mint < minj || mint == minj && tmint < tminj ? "Jerry\n" : "Tom\n");
    }
    return 0;
}

T6

不想写了,下次再说awa

评论

xuanxuan0604
T6:卡特兰数
乙鸟
厉害

发表评论

可以用@mike来提到mike这个用户,mike会被高亮显示。如果你真的想打“@”这个字符,请用“@@”。