• 第二次pta认证P测试C++


    在这里插入图片描述

    #include 
    using namespace std;
    int f(int n){
        if (n==0)
        {
            return 1;
        }
        if (n==1)
        {
            return 3;
        }
        return 4*f(n-1)-f(n-2);
    }
    int n;
    int main()
    {
        cin>>n;
        cout<<f(n);
        return 0;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    第二题

    试题编号:2022-13-0302
    试题名称:长正整数相加
    时间限制: 1.0s
    内存限制: 128.0MB
    【问题描述】
    输入两个十进制正整数 M 和 N,求它们的和,结果用十进制表示。注意,M
    和 N 可能非常大。
    【输入描述】
    第一行包含一个正整数 M(1≤M<10100);
    第二行包含一个正整数 N(1≤N<10100)。
    【输出描述】
    输出一个正整数,表示计算结果。
    【输入样例】
    769584695655486596597654685486745
    452537865655768856564568658
    【输出样例】
    769585148193352252366511250055403
    【题目解析】
    本题考察数组与字符串处理,及其与循环、分支的综合运用。以字符串输
    入,按照列竖式方式求解即可。需要注意进位情况的处理。如果使用
    std::string 和 std::reverse 则可简化代码。

    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    using namespace std;
    
    const int MAXN=10005;
    int a[MAXN],b[MAXN],c[MAXN],ans[MAXN],len_a,len_b,len_ans;
    
    void read(int *a,int &len){
        string s;
        cin >> s;
        len=s.length();
        for (int i = 0; i < len; ++i)
        {
            a[i]=s[i]-48;
        }
        reverse(a,a+len);
    }
    int main(){
        //高精度加法
        //读入两个加数,存入数组中
        read(a,len_a);
        read(b,len_b);
        len_ans=max(len_a,len_b);
        //进行相加操作
        for (int i = 0; i <= len_ans; ++i)
        {
            ans[i] = a[i]+b[i]+c[i];
            if (ans[i]>9)
            {
                //大于9,需要进位
                c[i+1]=ans[i]/10;
                ans[i]-=10;
            }
        }
        if (ans[len_ans]>0)
        {
            //最高位进位了,整体长度+1
            len_ans+=1;
        }
        //输出结果
        for (int i = len_ans-1; i >= 0; --i)
        {
            cout << ans[i];
        }
        cout << endl;
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52

    第三题

    试题编号:2022-13-0203
    试题名称:研究生入学考试
    时间限制: 1.0s
    内存限制: 128.0MB
    【问题描述】
    一年一度的研究生入学考试结束了,招生办的老师打算对所有的考生进行
    成绩排名,从而确定复试的名单。排名的规则如下:(1)以入学考试的平均成绩
    作为排名的依据(分数均为整数);(2)对于考生 A,如果总共有 K 个考生的平
    均成绩比 A 要高,那么 A 的排名为 K+1;(3)如果考生 A 和考生 B 的平均成绩相
    同,则他们的排名也相同。招生办的老师希望你能编写一个程序,来帮助他们
    解决这个问题。
    【输入描述】
    第一行为一个整数 N(1≤N≤1000),表示考生的人数。随后有 N 行,每
    一行有两个非负整数描述了一位考生的信息,依次为准考证号和平均成绩。其
    中,准考证号不超过 8 位,平均成绩不超过 200。
    【输出描述】
    输出共有 N 行,按照名次从高到低每行输出一位考生的信息,包括名次、
    准考证号和平均成绩。如果两位考生的名次相同,则以准考证号为序,考号小
    的在前,大的在后。
    【输入样例】
    5
    1000 95
    1001 100
    1002 94
    1006 95
    1007 100
    【输出样例】
    1 1001 100
    1 1007 100
    3 1000 95
    3 1006 95
    5 1002 94

    #include 
    #include 
    using namespace std;
    int n,num=1;
    struct student{
        int id;
        int score;
    };
    student s[1001];
    bool compare(student s1,student s2){
        if (s1.score>s2.score)
        {
            return true;
        } else if (s1.score==s2.score)
        {
            if (s1.id<s2.id)
            {
                return true;
            }
        }
        return false;
    }
    int main()
    {
        cin>>n;
        for (int i = 0; i < n; ++i)
        {
            cin>>s[i].id>>s[i].score;
        }
    
        sort(s,s+n,compare);
        for (int i = 0; i < n; ++i)
        {
            if (s[i].score!=s[i-1].score)
            {
                //与前一个成绩相同,排名不变
                num=i+1;
            }
            cout << num << " " << s[i].id << " " << s[i].score << endl;
        }
        
        return 0;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44

    第四题

    试题编号:2022-13-0203
    试题名称:跷跷板
    时间限制: 1.0s
    内存限制: 128.0MB
    【题目描述】
    游乐场的跷跷板以力矩相等原则判断是否平衡。即如果 wldl = wrdr,则认
    为跷跷板是平衡的。此处,wl、wr分别表示跷跷板左右两侧的物体体重,dl、dr
    分别表示左右两侧物体到跷跷板中央支点的距离。扩展跷跷板为多层结构,即
    wl与 wr均可以用子跷跷板代替。此时当且仅当所有子跷跷板都是平衡的,才称
    跷跷板为平衡的。
    【输入描述】
    采用递归方式输入数据。每行数据描述一个跷跷板。每行数据为用空格分
    隔的 4 个非负整数,分别表示 wl、dl、wr、dr。当 wl或 wr为 0 时,表示该物体实
    际上为一个子跷跷板,而接下来的数据将对该子跷跷板进行描述。而当 wl和 wr
    均为 0 时,先描述左子跷跷板,后描述右子跷跷板。因此,多层跷跷板的数据
    表示可总结为:先左后右,深度优先。
    【输出描述】
    如果该多层跷跷板为平衡的,输出 1,否则输出 0。
    【输入样例】
    0 1 0 3
    0 3 0 2
    4 1 2 2
    6 1 3 2
    3 4 2 6
    【输出样例】
    1

    第五题

    试题编号:2022-13-0305
    试题名称:最萌身高差
    时间限制: 1.0s
    内存限制: 128.0MB
    【问题描述】
    有 N 位同学获得了奖学金,现要从中选出两位代表上台领奖。出于“审
    美”要求,希望选出的两位代表 A 和 B 满足:A 的身高比 B 高,A 获得的奖学金
    比 B 多,且奖学金的差额大于 M。请计算选取上台同学的方案数。
    【输入描述】
    第一行包含两个正整数 N 和 M;
    第二行包含 N 个正整数 Si,分别代表第 i 位同学获得的奖学金。输入顺序
    在前的同学身高较高。
    【输出描述】
    输出一个正整数,表示方案数。
    【输入样例】
    6 2
    6 5 4 3 2 1
    【输出样例】
    6
    【数据范围】
    30%的数据满足:1<= N<= 100;
    100%的数据满足:
    1<= N<= 100000,1<= M<= 100000,1<= Si<= 100000。
    【题目解析】
    对 30%的数据,可以考虑逐次使用冒泡排序+二分查找完成。
    对 100%的数据,可以考虑采用归并排序的思路通过分治递归求解,也可以考虑
    使用线段树优化查找。

  • 相关阅读:
    Spring 原理
    拼多多开放平台订单信息查询接口【pdd.order.basic.list.get订单基础信息列表查询接口(根据成交时间)】代码对接教程
    CentOS 7 安装 MySQL5.7
    Allegro光绘Gerber文件、IPC网表、坐标文件、装配PDF文件导出打包
    行业追踪,2023-09-13
    SaaSBase:什么是企域数科?
    Netty框架详解
    【DNS系列】什么是正向DNS和反向DNS
    如何清理电脑病毒
    使用脚本定时备份MySql数据库文件
  • 原文地址:https://blog.csdn.net/q844258542/article/details/134308532