PAT乙级题库踩坑实录

PAT乙级题库踩坑实录

[截止2021.7.28乙级题库已经全部AC]

题目名称: 1030 完美数列 (25 分)

  • 测试点3踩坑
  • 每次取m后,不用从m后第一个元素开始判断是否大于mp,直接从m后第maccnt就可以,节省时间.

题目名称: 1032 挖掘机技术哪家强 (20 分)

  • 数组下标可能取到N,所以声明时应该声明为a[N+1].
  • 最后判断最值时,可以先把初值取成第一个元素值和下标(学校ID),如果默认取0,可能出现最后结果就是0,不符题意(学校ID从1开始取的.)
  • 测试点2踩坑

题目名称: 1033 旧键盘打字 (20 分)

  • 注意即时上档键"+"完好,如果某字母无法输出,其大写字母也无法输出.
  • 测试点4踩坑

题目名称: 1034 有理数四则运算 (20 分)

  • 求最大公约数.
  • 判断分数正负,同号为正,异号为负.不推荐使用a*b<0来判断,原因是很可能两个极大的数相乘以后超过了long long int 的范围,溢出导致为负.可以使用最笨的代码if ((a < 0 && b >0) || (a > 0 && b <0))
  • 分数加减乘除.ab,cd分别为两组分子分母.加: simplely(a*d+b*c, b*d).减: simplely(a*d-b*c, b*d).乘: simplely(a*c, b*d). 除: simplely(a*d, b*c).
  • 测试点3踩坑.

题目名称: 1035 插入与归并 (25 分)

完全不会做,参考的柳神的代码.

  • 插入排序和归并排序原理(如何根据中间序列来区分使用的是那种排序方法)
  • 非递归来模拟归并排序的过程(难点),注意和归并算法做区分.

题目名称: 1040 有几个PAT (25 分)

没想到啥好办法,最后参考的柳神的代码.
每次遇到A时根据此A字符前的P个数*此A字符后的T个数可以算得此A字符可组成的"PAT"个数.
然后遍历一遍字符串就可以得到总的.
关键点: 算P的个数从前遍历一个个++就可以,但是算后面的T的个数需要提前把总的T个数算出来.然后–.

题目名称: 1045 快速排序 (25 分)

笨办法硬遍历超时,最后用的柳神的办法:

  • 序列中只要满足左侧都比自己小,右侧都比自己大的元素,在这个序列中的从小到大的位序一定也是他当前的位置.
  • 再检查下左侧的所有元素是不是都小于自己就可以了.
  • 测试点2答案为0个主元,第二行没有内容,仍要输出空行,否则报错.

题目名称: 1048 数字加密 (20 分)

  • 只考虑了待加密字符串比密码长的情况,然而若明文比密码短的话也应该在最前面补0.
  • 踩坑点 测试点2 5

题目名称: 1049 数列的片段和 (20 分)

题目名称: 1050 螺旋矩阵(25) [模拟]

不会做…

  • 如何分解一个数,使之变成m*N,且m和n最相近.
  • 如何模拟生成非递增模拟矩阵.

题目名称: 1051 复数乘法 (15 分)

  • 浮点数类型保留小数点后位数格式为%.xf, x代表位数.会自动进行四舍五入.
  • 但是需要注意的是负的浮点数在舍掉小数变成0的时候,并不会将负号"-“去掉, 与我们日常习惯不同,此时需要根据要保留的小数位数的下一位四舍五入情况来手动去掉负号” -".例如保留两位小数%.2f,此时小于0但是大于-0.005(比比如-0.00001)时候,会变成“-0.00”,应该手动舍去负号.

题目名称: 1052 卖个萌 (20 分)

  • 刚开始用char类型来存储的表情符号,后来发现可能一个表情不止一个字节(比如中文符号),应该改成读取string并剔除[]字符.
  • c++中’‘字符代表转义,所以如果想打印’‘字符,需要使用’\’.

题目名称: 1053 住房空置率 (20 分)

  • 测试点1,2踩坑
    在这里插入图片描述
    观察期超过D天,不是小于e的天数超过D天…

题目名称: 1054 求平均值 (20 分)

  • 学习字符串转数字的方法.(也可以用来判断字符串是否是数字),这道题的重在学习判断字符串是否是符合格式的实数.
char a[50] = {0},b[50] = {0};
double temp;
cin >> a;
//按格式转换
sscanf(a,"%lf",&temp);
//重新转换回字符串
sprintf(b, "%.2f",temp);
//判断a和b是否一致.
for(int j = 0; j < strlen(a); j++)
{
	if(a[j] != b[j]) flag = 1;
}

题目名称: 1055 集体照 (25 分)

没啥坑,但是比较复杂,没做出来…

题目名称: 1064 朋友数 (20 分)

题目要求算朋友证号,而不是朋友数的朋友证号!
另外虽然AC了,方法很笨.
其实set容器就是这道题的量身定制.

题目名称: 1065 单身狗 (25 分)

  • 核心代码有点绕,费了点时间.
int m;
cin >> m;
vector<int> guest(m), ismarryed(100000);
for (int i = 0; i < m; i++)
{
    cin >>guest[i];
    //单身狗两种条件:①无cp②有cp但cp没出席
    //每有一位嘉宾出息,且其有cp,说明其伴侣若出席就不是单身狗
    if(couple[guest[i]]!= -1)
    {
        ismarryed[couple[guest[i]]] = 1;
    }
}
  • 测试用例1不过,仔细看题发现编号是可以取0000的,所以couple数组的默认值不能选0,应该在初始化的时候赋值成-1.

题目名称: 1068 万绿丛中一点红 (20 分)

  • 踩坑点一,格式错误整了半天,后来发现(5, 3): 16711680,不止16…前面有空格, 3前面也有一个空格…
  • 踩坑点二,点得唯一,不唯一的话就算是超过了阈值也不算数.
  • 判断八个方向的周围点是否满足差值参考了柳神的巧妙代码,自己写的贼笨…(可以定义八个方向的方向数组,然后遍历)
  • 判断差值可以不用abs()绝对值函数,直接判断上下限制也可以,即v[i][j] - v[tx][ty] >= (0-tol) && v[i][j] - v[tx][ty] <= tol

题目名称: 1070 结绳 (25 分)

  • 刚开始前三个点不过,百度了下发现原因出在第一根绳子多折了一次.具体代码如下,应该让sum的初值就等于第一根绳子长度,
int sum = v[0];
for (int i = 1; i< n;i++)
{
    sum = (sum + v[i])/2;
}

题目名称: 1073 多选题常见计分法 (20 分)

  • 个人认为是乙级题目里最麻烦的题…
  • 计算多选题的正误时,需要分只是漏选和选了错误选项两种,因为前者会得一半分.

题目名称: 1074 宇宙无敌加法器 (20 分)

  • 测试点1,3踩坑.
  • 两个数相加后若最高位的结果仍有近卫,需要在最终结果前补’1’.

题目名称: 1075 链表元素分类 (25 分)

  • 练静态链表的好题.
  • 稳定分类

题目名称: 1077 互评成绩计算 (20 分)

  • 一组整数算平均数并要求四舍五入怎么办?
    首先,整数如果直接求和sum并除以cnt会直接被截去小数部分,所以需要转换为实数类型在计算,小技巧,可以sum直接 *1.0即可.
    其次,实数在保留位数的时候会四舍五入,但是在类型转换为int时不会,需要我们手动+0.5后再类型转换.

题目名称: 1080 MOOC期终成绩 (25 分)

  • 踩坑点测试点3,看网上和柳神的代码应该有更巧的办法,但我就按自己的想法用map生撸了.
  • 测试点3排查了好久,网上大部分人都说是59.5也算及格导致的,但是看了半天我的代码已经四舍五入过了,还是不过.
  • 后来想到,期中考试Gmid没成绩的才打印-1.而每个人的成绩我是用结构体存的,默认值是0,最后打印的时候完全区分不出来是参加了考试考了0分还是没参加没成绩!SO,额外加了个字段flag来标示是真的考了0分的人,果然过了.
  • 贴下代码,我觉得只用map生撸反而锻炼了我的map遍历,迭代器失效分析,map往vector转,map排序等相关.
#include <iostream>
#include <map>
#include <vector>
#include <algorithm>

using namespace std;

struct Grade
{
    int flag;
    int Gp;
    int Gmid;
    int Gfinal;
    int G;
};
typedef pair<string,struct Grade> PAIR;

bool cmp_val(const PAIR &a,const PAIR &b)
{
    return a.second.G != b.second.G ? a.second.G > b.second.G : a.first < b.first;
}
int main()
{
    int P,M,N;
    cin >> P >> M >> N;
    string s;
    int code;
    map<string,struct Grade> m;
    for (int i = 0; i< P;i++)
    {
        cin >> s >> code;
        m[s].Gp = code;
    }
    for (int i = 0; i< M;i++)
    {
        cin >> s >> code;
        if (code ==0)
        {
            m[s].flag = 1;
        }
        m[s].Gmid = code;
    }
    for (int i = 0; i< N;i++)
    {
        cin >> s >> code;
        m[s].Gfinal = code;
        m[s].G = m[s].Gfinal;
        if (m[s].Gmid > m[s].Gfinal)
        {
            m[s].G = (int)(m[s].Gmid *0.4 +m[s].Gfinal *0.6 +0.5);
        }
    }

    auto iter = m.begin();
    while (iter != m.end())
    {
        if (iter->second.Gp < 200 || iter->second.G <60)
        {
            iter = m.erase(iter);
        }
        else
        {
            ++iter;
        }
    }

    vector<PAIR> v(m.begin(),m.end());
    sort(v.begin(),v.end(),cmp_val);

    for (auto item:v)
    {
        cout << item.first << " " << item.second.Gp << " "
                <<(item.second.Gmid? item.second.Gmid: (item.second.flag? 0:-1)) <<" "
                <<item.second.Gfinal<<" "<<item.second.G << endl;
    }

    return 0;
}

题目名称: 1081 检查密码 (15 分)

  • 测试点3踩坑.
  • 题目说了是一行一个密码,但是密码是有可能有空格的!!不能用cin来读入,因为cin遇到空格就结束了!需要改成用getline(cin,s)来读入,cin读入n之后记得getchar()把第一行末尾的换行符过滤掉.

题目名称: 1088 三人行 (20 分)

  • 测试点3踩坑
  • 丙不不一一定是int值,可能是4.5这样的数字~所以要用用double存储丙

题目名称: 1089 狼人杀-简单版 (20 分)

  • 完全不会做…抄的柳神的代码.
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值