软件学院PTA天梯赛初赛选拔赛题解

该博客汇总了多道算法题,包括生肖确定、韩信点兵、程序员买包子等。题目类型涉及模拟、思维、并查集、dfs等。博客给出了各题的输入输出格式、思路分析及AC代码,还对部分题的易错点和优化方法进行了说明。

目录

7-2 生肖确定(模拟)

AC代码:

7-3 韩信点兵(模拟)

AC代码:

7-4 程序员买包子(模拟)

AC代码:

7-5 h0078. 蛇形矩阵变形

AC代码:

7-6 军事体能成绩统计(升级版)(模拟)

AC代码:

7-7 铺草坪提高版(思维)

AC代码:

7-8 FJCC-GPLT(模拟)

AC代码:

7-9 看照片找基友(并查集)

AC代码:

7-10 小猫爬山(dfs+剪枝)

AC代码:

7-11 h0075. 射击游戏(dfs)

AC代码:

7-12 令人抓狂的四则运算(大模拟)

7-13 寻宝图(BFS+连通块)

7-14 完美树(树形DP,状态机,贪心)


7-2 生肖确定(模拟)

2023年是兔年,1年后(2024年)是龙年,1年前(2022年)是虎年。那么对于给定的一个整数n,请确定2023年之前(n为负数)或之后(n为正数)∣n∣年的结果年份及其对应的生肖(以英文单词表示,详见最后的提示)。

输入格式:

首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。每组测试输入1个整数n (−2023<n≤10000,n≠0)。

输出格式:

对于每组测试,在一行上输出结果年份及其对应的生肖,之间以一个空格间隔。

输入样例:

3
-1
1
2

输出样例:

2022 tiger
2024 dragon
2025 snake

提示:

鼠、牛、虎、兔、龙、蛇、马、羊、猴、鸡、狗、猪等十二生肖相应的英文单词如下:
rat、ox、tiger、rabbit、dragon、snake、horse、goat、monkey、rooster、dog、pig

思路:简单模拟题定义一个字符串数组把十二生肖对应的英文单词分别记录进去,随后依据题意进行模拟即可

AC代码:

#include <bits/stdc++.h>

using namespace std;

vector<string> item = {"rat", "ox", "tiger", "rabbit", "dragon", "snake", "horse", "goat", "monkey", "rooster", "dog", "pig"};

void solve() {
    int i, j, k, n, index = 3;
    cin >> n;
    int ans = 2023 + n;
    if (n < 0) {
        while (n++) {
            index--;
            if (index == -1) index = 11;
        }
    } else {
        while (n--) {
            index++;
            if (index == 12) index = 0;
        }
    }
    cout << ans << " " << item[index] << endl;
}

int main()
{
    int t;
    cin >> t;
    while (t--) {
        solve();
    }

    system("pause");
    return 0;
}

7-3 韩信点兵(模拟)

在中国数学史上,广泛流传着一个“韩信点兵”的故事:韩信是汉高祖刘邦手下的大将,他英勇善战,智谋超群,为汉朝建立了卓越的功劳。据说韩信的数学水平也非常高超,他在点兵的时候,为了知道有多少兵,同时又能保住军事机密,便让士兵排队报数:

  • 按从1至5报数,记下最末一个士兵报的数为1;
  • 再按从1至6报数,记下最末一个士兵报的数为5;
  • 再按从1至7报数,记下最末一个士兵报的数为4;
  • 最后按从1至11报数,最末一个士兵报的数为10;

请编写程序计算韩信至少有多少兵。

输入格式:

本题无输入

输出格式:

输出韩信至少拥有的士兵人数。

AC代码:

#include <bits/stdc++.h>

using namespace std;

int main()
{
    int i, j, k, n;
    n = 0;
    while (++n) {
        if (n % 5 == 1 && n % 6 == 5 && n % 7 == 4 && n % 11 == 10) break;
    }
    cout << n << endl;

    system("pause");
    return 0;
}

7-4 程序员买包子(模拟)

这是一条检测真正程序员的段子:假如你被家人要求下班顺路买十只包子,如果看到卖西瓜的,买一只。那么你会在什么情况下只买一只包子回家?
本题要求你考虑这个段子的通用版:假如你被要求下班顺路买 N 只包子,如果看到卖 X 的,买 M 只。那么如果你最后买了 K 只包子回家,说明你看到卖 X 的没有呢?

输入格式:

输入在一行中顺序给出题面中的 N、X、M、K,以空格分隔。其中 N、M 和 K 为不超过 1000 的正整数,X 是一个长度不超过 10 的、仅由小写英文字母组成的字符串。题目保证 N≠M。

输出格式:

在一行中输出结论,格式为:

  • 如果 K=N,输出 mei you mai X de
  • 如果 K=M,输出 kan dao le mai X de
  • 否则输出 wang le zhao mai X de.
    其中 X 是输入中给定的字符串 X。

输入样例1:

10 xigua 1 10

输出样例1:

mei you mai xigua de

输入样例2:

10 huanggua 1 1

输出样例2:

kan dao le mai huanggua de

输入样例3:

10 shagua 1 250

输出样例3:

wang le zhao mai shagua de

AC代码:

#include <bits/stdc++.h>

using namespace std;

int main()
{
    int n, m, k;
    string x;
    cin >> n >> x >> m >> k;
    if (k == n) cout << "mei you mai " << x << " de" << endl;
    else if (k == m) cout << "kan dao le mai " << x << " de" << endl;
    else cout << "wang le zhao mai " << x << " de" << endl;

    system("pause");
    return 0;
}

7-5 h0078. 蛇形矩阵变形

现在给你一个n*n的初始全零的矩阵,请你将其按以下方法填数:

但是这样子太过简单,所以每一次操作会选择一个子矩阵,请你在其子矩阵上进行填数,并在最后输出整个矩阵

输入格式:

第一行两个整数n,m,表示矩阵的大小和操作次数(n≤2000,m≤3000)接下来m行,每行输入三个正整数x,y,k,表示在以(x,y)为左上角,边长为k的方阵内填数(1≤x,y≤n,max(x+k−1,y+k−1)≤n)

输出格式:

输出一个n*n的矩阵,每个整数占5个字节。

输入样例:

3 2
1 1 3
2 2 2

输出样例:

    1     2     3
    6     1     2
    7     4     3

思路:按题意进行模拟即可,在进行行数变换的时候可以定义一个bool类型的变量,可以用来区分此行是正方向还是负方向

AC代码:

#include <bits/stdc++.h>

using namespace std;

const int maxn = (int)2e3 + 10;
vector<vector<int>>nums(maxn, vector<int>(maxn, 0));

int n, m;

void solve() {
    int i, j, k, x, y;
    int item = 1;
    bool flag = true;
    cin >> x >> y >> k;
    x--, y--;
    for (i = x; i < x + k; i++) {
        if (flag)
            for (j = y; j < y + k; j++) nums[i][j] = item++;
        else
            for (j = y + k - 1; j >= y; j--) nums[i][j] = item++;
        flag = !flag;
    }
}

int main()
{
    int i, j, k;
    cin >> n >> m;
    while (m--) {
        
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值