PTA团体程序设计天梯赛L1真题讲解L1-085-088

官网https://pintia.cn/problem-sets/994805046380707840/exam/problems/type/7

文章目录

    • [L1-085 试试手气](#L1-085 试试手气)
    • [L1-086 斯德哥尔摩火车上的题](#L1-086 斯德哥尔摩火车上的题)
    • [L1-087 机工士姆斯塔迪奥](#L1-087 机工士姆斯塔迪奥)
    • [L1-088 静静的推荐](#L1-088 静静的推荐)

L1-085 试试手气

题目大意:给定6个骰子的初始朝上点数,每次摇骰子需满足两条规则:每个骰子的点数不能和自身之前出现过的任何点数重复;在满足第一条规则的前提下,每个骰子都取当前可行的最大点数。求第k次摇出的6个骰子的点数结果。

核心思路

6个骰子的点数变化相互独立,可逐个单独计算。对于单个骰子,初始点数为第0次的状态,后续每次都从剩余未出现的点数中选择最大值,因此每个初始点数对应的后续序列是固定的:排除初始点数后,将1~6从大到小排列,依次对应第1、2、3、4、5次的结果。

例如初始点数为3时,排除3后剩余点数降序为6、5、4、2、1,对应第1次结果为6,第2次为5,第3次为4,以此类推。

正解代码

cpp 复制代码
#include<iostream>
#include<vector>
using namespace std;
int sz(int x,int y){
    int a1[]={1,6,5,4,3,2},a2[]={2,6,5,4,3,1},a3[]={3,6,5,4,2,1},
        a6[]={6,5,4,3,2,1},a5[]={5,6,4,3,2,1},a4[]={4,6,5,3,2,1};
    if(x==a1[0])return a1[y];
        else  if(x==a2[0])return a2[y];
        else  if(x==a3[0])return a3[y];
        else if(x==a4[0])return a4[y];
        else if(x==a5[0])return a5[y];
        else if(x==a6[0])return a6[y];
}
int main(){
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    vector<int>b(6);
    for(int i=0;i<6;i++)cin>>b[i];
    int y;cin>>y;
    for(int i=0;i<6;i++){
        if(i!=5)cout<<sz(b[i],y)<<" ";
        else cout<<sz(b[i],y);
    }
    return 0;
}

代码实现要点

  • 预处理6种初始点数对应的结果数组,数组下标对应摇的次数,通过查表直接获取结果。
  • 输入6个初始点数和次数k,遍历每个骰子查表,按格式输出结果。

L1-086 斯德哥尔摩火车上的题

题目大意:给定两个数字字符串,按照指定算法处理字符串:从第二个字符开始遍历,若当前字符与前一个字符的奇偶性相同,则将两个字符中较大的字符拼接到结果字符串末尾。比较两个字符串的处理结果,相同则输出该结果,不同则分别输出两个结果。

核心思路

封装独立的字符串处理函数,输入原始数字字符串,按规则生成结果字符串,再将两个输入字符串分别处理后对比输出即可。

由于数字字符的ASCII码奇偶性与对应数字的奇偶性一致(数字d的ASCII值为48+d,48为偶数,因此奇偶性与d相同),可直接对字符做取模运算判断奇偶;同时字符的ASCII大小顺序与数字大小顺序一致,直接使用max比较字符即可。

正解代码

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
string res(string s){
string ans;
    for (int i= 1; i < s.size(); i++) {
        if (s[i] % 2 == s[i-1] % 2) {
            ans += max(s[i], s[i-1]);
        }
    }
    return ans;
}

int main(){
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    string s1,s2;
    cin>>s1>>s2;
    if(res(s1)==res(s2))cout<<res(s1);
    else cout<<res(s1)<<endl<<res(s2);
    return 0;
}

代码实现要点

  • 封装处理函数提升代码复用性,函数内从下标1开始遍历字符串。
  • 逐位判断相邻两个字符的奇偶性,符合条件则拼接较大字符。
  • 对比两个处理结果,按题目要求格式输出。

L1-087 机工士姆斯塔迪奥

题目大意:给定n行m列的网格,共q次操作,每次操作标记一整行或一整列为危险区域。求最终安全格子的总数(安全格子指所在行和所在列均未被标记的格子)。

核心思路

安全格子的数量计算公式为:未被标记的行数 × 未被标记的列数

重复标记同一行/列不会产生额外效果,因此需要统计去重后的被标记行数与列数。未被标记行数 = 总行数n - 不同的被标记行数;未被标记列数 = 总列数m - 不同的被标记列数,二者相乘即为最终答案。

例如样例中5行5列,共标记2个不同行、1个不同列,安全格子数为 (5-2) × (5-1) = 12

正解代码

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+9;
bool a[2][N];
int main(){
    int n,m,q;
    cin>>n>>m>>q;
    while(q--){
        int l,r;
        cin>>l>>r;
        if(l==0&&!a[0][r]){
            a[0][r]=1;
            n--;
        }
        if(l==1&&!a[1][r]){
            a[1][r]=1;
            m--;
        }
    }
    cout<<n*m;

    return 0; 
}

代码实现要点

  • 使用两个布尔数组分别记录行、列的标记状态,避免重复计数。
  • 遍历所有操作,遇到未标记的行/列则打上标记,并将对应剩余行数/列数减1。
  • 最终输出剩余行数与剩余列数的乘积。

L1-088 静静的推荐

题目大意:从参赛学生中选拔推荐名单,规则如下:

  1. 仅考虑天梯赛分数不低于175分的学生;
  2. 共可推荐k批次,同一批次内学生成绩原则上严格递增;
  3. 若学生天梯赛成绩与同批前一人相同,但PAT成绩达到企业面试分数线,则也可加入该批次。
    求最多可推荐的学生总人数。

核心思路

为最大化推荐人数,采用最优分配策略:

  • PAT达标学生:所有天梯赛≥175且PAT达标的学生均可被推荐。同分的PAT达标学生不受严格递增限制,可全部放入对应批次,不占用普通学生的批次名额。
  • 普通学生(PAT未达标) :每个分数的普通学生,最多每批次推荐1人,共k批次,因此每个分数最多推荐 min(该分数普通学生人数, k) 人。

总推荐人数 = 天梯赛≥175且PAT达标的人数 + 每个分数普通学生人数取min(人数, k)的总和。

正解代码

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int main(){
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int n,k,s,cnt=0,ans=0;
    cin>>n>>k>>s;
    map<int,int>mp;
    for(int i=0;i<n;i++){
        int x,y;
        cin>>x>>y;
        if(x>=175){
            if(y>=90)cnt++;
            else mp[x]++;
        }
    }
    ans+=cnt;
    for(auto i:mp)ans+=min(i.second,k);
    
    cout<<ans;

    return 0;
}

代码实现要点

  • 遍历所有学生,筛选出天梯赛分数≥175的学生。
  • 若学生PAT成绩达到输入的分数线s,直接计入达标总数;否则用map或数组统计每个分数的普通学生人数。
  • 遍历所有分数的普通学生人数,累加min(人数, k),再加上达标总数得到最终答案。
相关推荐
沙盘客1 小时前
AFSIM 14篇 C++ 插件开发:扩展你的仿真能力
c++·后端
NeilYuen1 小时前
【vemory】高性能KV存储AOF方案设计
linux·c++·redis·缓存
听取WA声一片(无恶意)2 小时前
CSP-J/S 初赛图论完全讲义
算法·csp-s初赛·csp-j初赛
Brilliantwxx2 小时前
【算法从零到千】【51-54】逆序对(分治+递归算法)
数据结构·算法·排序算法
小星星闪亮登场2 小时前
2026河南萌新联赛第四场--南阳理工学院
数据结构·算法·贪心算法·动态规划·哈希算法·广度优先
土司大王2 小时前
LeetCode hot100——两数之和
数据结构·算法·leetcode
luj_17682 小时前
大航海时代:沉浸式财商实战沙盒
c语言·开发语言·网络·经验分享·算法
Navigator_Z3 小时前
LeetCode //C - 1200. Minimum Absolute Difference
c语言·算法·leetcode
wabs6663 小时前
关于字符串【力扣344.反转字符串的思考】
数据结构·算法·leetcode