2024团体程序设计天梯赛 L1-1~L3-1 AC代码

目录

L1-1 编程解决一切

L1-2 再进去几个人

L1-3 帮助色盲

L1-4 四项全能

L1-5 别再来这么多猫娘了! 

L1-6 兰州牛肉面

L1-7 整数的持续性

L1-8 九宫格

L2-1 鱼与熊掌

L2-2 懂蛇语

L2-3 满树的遍历

L2-4 吉利矩阵

L3-1 夺宝大赛


题目可以在PTA团体程序设计天梯赛-练习集 练习提交

L1-1 编程解决一切

50855cefda584ad4be67baa648f66d9b.png

AC代码(Python3):

print("Problem? The Solution: Programming.")

L1-2 再进去几个人

5a201022664a470383a9b036363ad10d.png

AC代码(Python3):

n,m = input().split()
print(int(m)-int(n))

L1-3 帮助色盲

0c9d3ef7edb34d7391009c1697678845.png

1ae7c93bc8fb4414b7757ca82b0ba909.png

题意:红绿色盲患者分辨不出红绿灯,但是可以看别人的行动决定走不走。题目输入A和B,A是交通灯的颜色,根据灯的颜色判断能不能走。B是前面有没有人,没有人而且不是黄灯就需要根据要求输出提示音。

AC代码:

#include <bits/stdc++.h>
using namespace std;

int a,b;

int main() {
    cin >> a >> b;
    
    if(a == 0 && b == 0) cout << "biii\n";
    else if(a == 1 && b == 0) cout << "dudu\n";
    else cout << "-\n";
    
    if(a == 1) cout << "move";
    else cout << "stop";
}

L1-4 四项全能

d9655b50bfe5471099b1e1b125011af8.png

AC代码:

#include <bits/stdc++.h>
using namespace std;

int n, m, x, sum;

int main() {
    cin >> n >> m;
    
    for(int i=0;i<m;i++) {
        cin >> x;
        sum += x;
    }
    cout << max(0, sum-n*(m-1));
}

L1-5 别再来这么多猫娘了! 

省略前面无关内容

b21d73c74aef483ebf2354d50bc84e2b.png

a5f963fe5472444eae1832ac612422b3.png

题意:给出一行不超过5000字符的字符串,统计其中的违禁词数量。如果个数少于阈值,则将违禁词替换为<censored>,否则输出违禁词的数量,然后输出一行警告。

违禁词替换后从这个词的下一个字符继续,比如违禁词为AA,文本为AAA,则替换后为<censored>A。要注意违禁词就是<censored>的情况,先把违禁词替换为=,输出的时候再判断输出。

AC代码:

#include <bits/stdc++.h>
using namespace std;

int n, k, res;
vector<string> v;
string s;

int main() {
    cin >> n;
    for(int i=0;i<n;i++) {
        string s1;
        cin >> s1;
        v.push_back(s1);
    }
    
    cin >> k;
    cin.get();
    getline(cin,s);
    
    // 遍历v中的所有词,替换为=
    for(int i=0;i<v.size();i++){
        while(s.find(v[i]) != string::npos){
            s.replace(s.find(v[i]),v[i].size(),"=");
            res++;
        }
    }
    
    if(res < k) {
        for(int i=0;i<s.size();i++) {
            if(s[i] == '=') cout << "<censored>";
            else cout << s[i];
        }
    } else {
        cout << res << endl;
        cout << "He Xie Ni Quan Jia!";
    }
}

L1-6 兰州牛肉面

31e769cb49d142e3afb5295478019a7c.png

fbc107db555c42229f32ed040888f973.png

AC代码:

#include <bits/stdc++.h>
using namespace std;

int n, x, y;
int a[105];
double p[105], sum;

int main() {
    cin >> n;
    for(int i=1;i<=n;i++) cin>>p[i];
    
    while(cin>>x>>y, x) {
        a[x] += y;
        sum += y*p[x];
    }
    
    for(int i=1;i<=n;i++) {
        cout << a[i] <<endl;
    }
    printf("%.2f",sum);
}

L1-7 整数的持续性

87af941df86c4f3a8bc8ea8938f918a4.png

AC代码∶

#include <bits/stdc++.h>
#define ll long long
using namespace std;

int a, b, maxn;
map<int,vector<int>> mp;

int f(int x) {
    int cnt = 0, tmp = 1;
    while(x >= 10) {
        cnt++;
        // 计算x每一位的乘积
        tmp = 1;
        while(x) {
            tmp*=(x%10);
            x/=10;
        }
        x = tmp;
    }
    return cnt;
}

int main() {
    cin >> a >> b;
    for(int i=a;i<=b;i++) {
        int cnt = f(i);
        mp[cnt].push_back(i);
        maxn = max(maxn, cnt);
    }
    cout << maxn << endl;
    for(int i=0;i<mp[maxn].size();i++) {
        if(i != 0) cout << " ";
        cout << mp[maxn][i];
    }
}

L1-8 九宫格

7303f4039a2e4315b1d70dafb82a3f25.png

AC代码∶

#include<bits/stdc++.h>
using namespace std;

int n;

void check() {
    int r[10][10], col[10][10], rect[10][10];
    int g[10][10];
    memset(r,0,sizeof r);
    memset(col,0,sizeof col);
    memset(rect,0,sizeof rect);
    memset(g,0,sizeof g);
    
    for(int i=0;i<9;i++) {
        for(int j=0;j<9;j++) {
            cin >> g[i][j];
        }
    }

    bool flag = 1;
    for(int i=0;i<9;i++) {
        for(int j=0;j<9;j++) {
            int x = g[i][j];
            if(x < 1 || x > 9) flag = 0;
            if(r[i][x]) flag = 0;
            if(col[j][x]) flag = 0;
            if(rect[i/3*3+j/3][x]) flag = 0;
            r[i][x] = col[j][x] = rect[i/3*3+j/3][x] = 1;
        }
    }
    cout << flag << endl;
}

int main(){
    cin >> n;
    for(int i=0;i<n;i++) {
        check();
    }
}

L2-1 鱼与熊掌

7cae8e2368b1401db3dfe7cba399430a.png

AC代码∶

#include <bits/stdc++.h>
using namespace std;

const int N = 1e5+5;
int n, m, k, q;
vector<int> v[N];

int main() {
    cin >> n >> m;
    for(int i=1;i<=n;i++) {
        cin >> k;
        while(k--) {
            int x;
            cin >> x;
            v[x].push_back(i);
        }
    }
    cin >> q;
    while(q--) {
        int x, y, cnt = 0;
        cin >> x >> y;
        unordered_map<int,int> mp;
        // 记录x中的所有人的编号
        for(auto i:v[x]) 
            mp[i] = 1;
        // 记录同时存在x和y中的人数
        for(auto i:v[y]) {
            if(mp[i]) cnt++;
        }
        cout << cnt << endl;
    }
}

L2-2 懂蛇语

e0c2801169904aefa26d15d296fcf804.png

AC代码∶

#include <bits/stdc++.h>
using namespace std;

int n, m;
unordered_map<string,vector<string>> mp;
string s;

int main() {
    cin >> n;
    cin.get();
    for(int i=0;i<n;i++) {
        getline(cin,s);
        stringstream ss;
        ss << s;
        string tmp = "", tmp2 = "";
        // ss相当于cin,遇到空格结束,取出s中的所有单词
        while(ss >> tmp) {
            tmp2 += tmp[0]; // 取出首字母
        }
        mp[tmp2].push_back(s);
    }
    
    cin >> m;
    cin.get();
    for(int i=0;i<m;i++) {
        // 操作同上
        getline(cin,s);
        stringstream ss;
        ss << s;
        string tmp = "", tmp2 = "";
        while(ss >> tmp) {
            tmp2 += tmp[0];
        }
        
        if(mp[tmp2].size() == 1) {
            cout << mp[tmp2][0] << endl;
        }
        else if(mp[tmp2].size() == 0) {
            cout << s << endl;
        }
        else {
            sort(mp[tmp2].begin(), mp[tmp2].end());
            for(int j=0;j<mp[tmp2].size();j++) {
                if(j != 0) cout << "|";
                cout << mp[tmp2][j];
            }
            cout << endl;
        }
    }
}

L2-3 满树的遍历

44fec96109f9482cadbc8a4ec34f947a.png

AC代码∶

#include<bits/stdc++.h>
using namespace std;

const int N = 1e5+5;
int n, m, x, k, root;
vector<int> tr[N];

void dfs(int node) {
    for(auto i:tr[node]) {
        cout << " " << i;
        dfs(i);
    }
}

int main(){
    cin >> n;
    for(int i=1;i<=n;i++) {
        cin >> x;
        if(x) tr[x].push_back(i);
        else  root = i;
        if(tr[x].size() > k) k = tr[x].size();
    }

    cout << k << " ";
    bool flag = 1;
    for(int i=1;i<=n;i++) {
        // 这里要排序,题目要求兄弟节点按编号升序访问
        sort(tr[i].begin(), tr[i].end());
        if(tr[i].size() != 0 && tr[i].size() != k) {
            flag = 0;
        }
    }
    if(flag) cout << "yes\n";
    else cout << "no\n";
    cout << root;
    dfs(root);
}

L2-4 吉利矩阵

ae3b91cfbf114a7ca24a933eb8cc986e.png

没想出来怎么写,写了十几个for循环打表。

AC代码∶

#include<bits/stdc++.h>
using namespace std;

int n, l;
int res[5][10] = {
    {},
    {},
    {0,0,3,4,5,6,7,8,9,10},
    {0,0,21,55,120,231,406,666,1035,1540},
    {0,0,282,2008,10147,40176,132724,381424,981541,2309384}
};

int main(){
    cin >> l >> n;
    cout << res[n][l];
}

L3-1 夺宝大赛

36d8fc9e6620435fa05a1dfb41d70930.png

d3a853a5d0a742358303906d2b1cc4fc.png

题意:有k个队伍从各自的起点出发,各自选择各自到大本营最近的路径前往大本营,同时到达大本营的多个队伍会发生火拼,最早到达大本营而且没有发生火拼的队伍获胜。这里我们从大本营向外按层bfs,同一层内(到大本营的距离相同)只有一支队伍时这个队伍获胜,如果搜索完都没有这样的队伍,输出No winnner.

按层bfs可以看这个:二叉树的层序遍历 - 力扣(LeetCode),与一般的bfs不同,这个每次取出队列离起点同样距离的所有元素,就可以直接统计相同距离的队伍有多少个。

AC代码∶

#include <bits/stdc++.h>
using namespace std;

const int N = 1e2+5;

int n, m, k, x, y;
int sx, sy;
int g[N][N];
struct node {
    int x,y;
    int cnt;
};
int dx[]={0,0,-1,1}, dy[]={-1,1,0,0};

void bfs() {
    queue<node> q;
    q.push({sx,sy,0});
    g[sx][sy] = 0;
    
    while(!q.empty()) {
        // 每次取出所有点,这样队列中的点的cnt就都是相同的
        // 同一层只有一个队伍时结束
        int t = q.size();
        int cntt = 0;
        int res, resc;
        while(t--) {
            node tmp = q.front();
            q.pop();
            for(int i=0;i<4;i++) {
                int xx = tmp.x + dx[i];
                int yy = tmp.y + dy[i];
                if(xx<1||xx>m||yy<1||yy>n||g[xx][yy]==0)
                    continue;

                if(g[xx][yy]>1) {
                    // 大于1说明是队伍,统计同一层内的队伍
                    cntt++;
                    res = g[xx][yy], resc = tmp.cnt+1;
                }
                g[xx][yy] = 0;

                q.push({xx,yy,tmp.cnt+1});
            }
        }
        if(cntt == 1) {
            cout << res-10 << " " << resc;
            return ;
        }
    }
    cout << "No winner.";
}

int main() {
    cin >> m >> n;
    for(int i=1;i<=m;i++) {
        for(int j=1;j<=n;j++) {
            cin >> g[i][j];
            if(g[i][j] == 2) sx = i,sy = j;
        }
    }
    cin >> k;
    for(int i=1;i<=k;i++) {
        cin >> y >> x;  // 注意这里输入是列在前面
        g[x][y] = 10 + i; // 将起点和其他区别开
    }
    bfs();
}

  • 35
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
根据提供的引用内容,这段代码是用来统计输入数字中奇数和偶数的个数的。代码中使用循环遍历输入的数字,通过对2取模运算来判断数字是奇数还是偶数,然后分别对奇数和偶数的计数变量进行加一操作。循环结束后,输出奇数计数变量和偶数计数变量的值,中间用空格隔开。\[1\]\[2\]\[3\] 这段代码可以用来解决团体程序设计天梯-练习集 L1-022 奇偶分家的问题。 #### 引用[.reference_title] - *1* [PTA团队天梯║L1-022 奇偶分家](https://blog.csdn.net/m0_46492118/article/details/114481127)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [PAT团队程序设计天梯-习题集L1-022 奇偶分家](https://blog.csdn.net/qq_38234015/article/details/81291913)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [团体程序设计天梯-练习集 L1-022 奇偶分家 (10分)(C语言)](https://blog.csdn.net/Baridhu/article/details/109899606)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值