第三次pta认证P测试C++

第一题

试题编号:
试题名称:春游
时间限制: 1.0s
内存限制: 128.0MB

【问题描述】
老师带领班级到公园春游。自由活动时间结束,老师发现有一名同学还没有归队。已知班上共有 N
名同学,每位同学都有一个从 1 到 N 的班级内编号用以区分。现在归队的同学分别报出自己的班级内
编号,你能帮老师找到是哪位同学仍未归队吗?
【输入描述】
第一行一个整数 N,代表共 N 名同学。
第二行 N-1 个不同的数字(1 ≤ ≤ ),代表已归队的同学编号。
【输出描述】
输出一个整数,即没有归队的同学编号。
【输入样例】
5
1 5 3 2
【输出样例】
4
【数据规模】
100%的数据满足1 ≤ ≤ 2
15。

#include 
#include 
#include 
using namespace std;

int n,a,x[1024*32+1];
int main()
{
    cin>>n;
    for (int i = 1; i <= n-1; ++i)
    {
        cin>>a;
        x[a]++;
    }
    for (int i = 1; i <= n-1; ++i)
    {
        if (x[i]==0)
        {
            cout << i;
            break;
        }
    }
    return 0;
}

第二题

试题编号:
试题名称:学生会提名
时间限制: 1.0s
内存限制: 128.0MB

【问题描述】
学生会选举要开始了。根据选举规则,首先由全体同学进行提名,每位同学可以从全体同学中提
名一名同学参选。选举时,会从全体同学的提名中选出一名学生会主席,再从三个年级分别的提名中
各选出一名副主席。现在,三名志愿者分别收集了三个年级的同学的提名,想要统计一下,三个年级
分别提名了多少名同学,以及全体同学提名了多少名同学。
【输入描述】
第一行三个整数1、2、3,表示一、二、三年级分别收集的提名数。
第二行1个不同的整数,代表一年级提名的同学学号。
第三行2个不同的整数,代表二年级提名的同学学号。
第四行3个不同的整数,代表三年级提名的同学学号。
【输出描述】
输出四个整数,空格分隔。前三个整数分别为一、二、三年级提名的同学数,第四个整数为全体同
学提名的同学数。
【输入样例】
5 8 3
1 5 3 5 2
6 4 2 7 4 2 1 3
7 1 2
【输出样例】
4 6 3 7
【数据规模】
30%的数据满足1 ≤ 1, 2, 3 ≤ 2
10,1 ≤
,
, ≤ 2
15

100%的数据满足1 ≤ 1, 2, 3 ≤ 2
16,1 ≤
,
, ≤ 2
30。

#include 
#include 
#include 
using namespace std;

int n1,n2,n3,a;
set<int> s1,s2,s3,s;
int main()
{
    cin>>n1>>n2>>n3;
    for (int i = 1; i <= n1; ++i)
    {
        cin>>a;
        s1.insert(a);
        s.insert(a);
    }
    for (int i = 1; i <= n2; ++i)
    {
        cin>>a;
        s2.insert(a);
        s.insert(a);
    }
    for (int i = 1; i <= n3; ++i)
    {
        cin>>a;
        s3.insert(a);
        s.insert(a);
    }
    printf("%ld %ld %ld %ld\n",s1.size(),s2.size(),s3.size(), s.size());
    
    return 0;
}

第三题

试题编号:
试题名称:数字统计
时间限制: 1.0s
内存限制: 128.0MB

【问题描述】
给定正整数 N 和一个数字 D(1 ≤ ≤ 9),输出所有不大于 N 的非负整数中 D 出现的次数。
例如,在不大于 12 的非负整数中,1 出现了 5 次,分别为 1、10、11(2 次)、12,共 5 次。
【输入描述】
2 个正整数 D 和 N。
【输出描述】
一个整数,即所有不大于 N 的非负整数中出现 D 的次数。
【输入样例】
1 12
【输出样例】
5
【数据规模】
40%的数据满足1 ≤ < 106

100%的数据满足1 ≤ < 1016。

#include 
using namespace std;

int n,d,ans,a;
int main()
{
    cin>>d>>n;
    for (int i = 0; i <= n; ++i)
    {
        a=i;
        if (a==0&&d==a)
        {
           ans++;
        }
        while(a){
            if (a%10==d)
            {
                ans++;
            }
            a/=10;
        }
    }
    cout<<ans;
    
    return 0;
}

第四题

试题编号:
试题名称:大富翁游戏
时间限制: 1.0s
内存限制: 128.0MB

【问题描述】
小明很喜欢玩大富翁游戏,这个游戏的规则如下:
1、游戏地图是有 N 个格子,分别编号从 1 到 N。玩家一开始位于 1 号格子。
2、地图的每个格子上都有事件,事件有以下两种类型:
A)罚款 x 枚金币。如果 x 为负数,则表示获得-x 枚金币;
B)强制前进 y 个格子(输入数据保证,前进后不会越过 N 号格子)。
3、游戏开始时首先触发 1 号格子的事件,然后开始玩家回合。
4、玩家每回合可以选择前进 1 或 2 个格子(不可以不移动,不可以越过 N 号格子),之后触发停
留的格子的事件。
4.1、如果触发的是 A 类事件,进行罚款。若罚款后金币数小于 0,则游戏失败,否则继续下一个
回合;
4.2、如果触发的是 B 类事件,强行前进。若强行前进后所在的格子为 A 类事件,则按照 4.1 的规
则触发 A 类事件;若为 B 类事件,则当前回合不再触发 B 类事件。
5、如果玩家回合结束时,处在 N 号格子,且金币数大于等于 0,则游戏胜利。
可以看出,如果玩家一开始有足够多的金币,总是能够通过合理选择前进方案获得胜利。小明想
知道,一开始最少需要多少金币,才有可能取得游戏胜利?
【输入描述】
第一行给出正整数 N,为地图的长度。
接下来 N 行,分别描述从 1 到 N 号格子的事件:A x 或者 B y。
【输出描述】
一个整数,要取得游戏胜利,最少需要的金币数。
【输入样例】
7
A -2
A 3
B 1
A 2
A 4
A 2
A 0
【输出样例】
2
【数据规模】
100%数据满足2 ≤ ≤ 128,−8 ≤ ≤ 8,0 ≤ ≤ 2。

第五题

试题编号:
试题名称:二进制变换
时间限制: 1.0s
内存限制: 128.0MB

【问题描述】
小明定义了一个函数 F:输入的正整数 x 的二进制表达中 1 出现的次数。例如,F(13)=3,因为
(13)10 = (1101)2。然后,小明发现,F(x)总是小于等于 x,而且任意正整数 x 经过若干次函数 F 的变
换后,总会成为 1。如果一个正整数 x 恰好经过 k 次函数 F 的变换后成为 1,则小明称之为 k 变换数。
小明想知道有多少个不大于 N 的 k 变换数,你可以帮帮他吗?
【输入描述】
第一行表示整数 N,是一个没有前导零的二进制表示。
第二行包含整数 k。
【输出描述】
输出一个正整数。因为不大于 N 的 k 变换数的数量可能很大,请把结果模109 + 7后输出。
【输入样例】
110
2
【输出样例】
3
【数据规模】
20%的数据满足1 ≤ < 2
18,0 ≤ ≤ 1000;
100%的数据满足1 ≤ < 2
1000,0 ≤ ≤ 1000。

你可能感兴趣的:(c++,算法,数据结构)