第四次pta认证P测试

第一题

试题编号:
试题名称:整数排序
时间限制: 1.0s
内存限制: 128.0MB
【问题描述】
老师给定 10 个整数的序列,要求对其重新排序。排序要求:
1.奇数在前,偶数在后;
2.奇数按从大到小排序;
3.偶数按输入顺序逆序排序。
【输入描述】
输入一行,包含 10 个整数,彼此以一个空格分开,每个整数的范围是大于等于 0,小于等于 100。
【输出描述】
按照要求排序后输出一行,包含排序后的 10 个整数,数与数之间以一个空格分开。
【输入样例】
4 7 3 13 11 12 0 47 34 98
【输出样例】
47 13 11 7 3 98 34 0 12 4
【数据规模】

#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;

int a[10],b[10];
int m,n,x;
vector<int> v;

int main()
{
    for (int i = 0; i < 10; ++i)
    {
        cin >> x;
        if (x%2==0)
        {
            v.push_back(x);
            m++;
        } else {
            a[n]=x;
            n++;
        }
    }
    sort(a,a+n,greater<int>());
    reverse(v.begin(),v.end());
    for (int i = 0; i < n; ++i)
    {
        cout << a[i] << " ";
    }
    for (int i = 0; i < m; ++i)
    {
        cout << v[i] << " ";
    }

    return 0;
}

第二题

试题编号:
试题名称:志愿者选拔
时间限制: 1.0s
内存限制: 128.0MB
【问题描述】
学生志愿者选拔活动正在展开,首先进行笔试,笔试分数达到面试分数线的选手方可进入面试。
面试分数线根据计划录取人数的 150%划定,即如果计划录取 m 名志愿者,则面试分数线为排名
第 m×150%(向下取整)名的选手的分数,而最终进入面试的选手为笔试成绩不低于面试分数线的所
有选手。
现在就请你编写程序划定面试分数线,并输出所有进入面试的选手的报名号和笔试成绩。
【输入描述】
第一行两个整数 n,m(5≤n≤5000,3≤m≤n),中间用一个空格隔开,其中 n 表示报名参加笔试的
选手总数,m 表示计划录取的志愿者人数。输入数据保证 m×150% 向下取整后小于等于 n。
第 二 行 到 第 n+1 行 , 每 行 包 括 两 个 整 数 , 中 间 用 一 个 空 格 隔 开 , 分 别 是 选 手 的 报 名
号 k(1000≤k≤9999)和该选手的笔试成绩 s(1≤s≤100)。数据保证选手的报名号各不相同。
【输出描述】
第一行,有 2 个整数,用一个空格隔开,第一个整数表示面试分数线;第二个整数为进入面试的
选手的实际人数。
从第二行开始,每行包含 2 个整数,中间用一个空格隔开,分别表示进入面试的选手的报名号和
笔试成绩,按照笔试成绩从高到低输出,如果成绩相同,则按报名号由小到大的顺序输出。
【输入样例】
6 3
1100 85
1200 85
1009 90
1004 91
3927 92
8700 84
【输出样例】
85 5
3927 92
1004 91
1009 90
1100 85
1200 85
【样例说明】
m×150%=3×150%=4.5,向下取整后为 4。保证 4 个人进入面试的分数线为 85,但因
为 85 有重分,故最终有 5 个人进入面试。

#include 
#include 
using namespace std;

struct student{
    int id;
    int score;
};
student s[5001];
int n,m,num,socre_line;

bool compare(student a,student b){
    if (a.score>b.score)
    {
        return true;
    }
    return false;
}

int main()
{
    cin >> n >> m;
    for (int i = 1; i <= n; ++i)
    {
        cin >> s[i].id >> s[i].score;
    }
    num = m*1.5;
    sort(s+1,s+n+1,compare);
    for (int i = num; i <= n ; ++i)
    {
        if (s[i+1].score==s[i].score)
        {
            //说明同分,一样录取
            num++;
        } else {
            break;
        }
    }

    cout << s[num].score << " " << num << endl;
    for (int i = 1; i <= num; ++i)
    {
        cout <<  s[i].id << " " << s[i].score << endl;
    }
    return 0;
}

第三题

试题编号:
试题名称:富有的大壮
时间限制: 1.0s
内存限制: 128.0MB
【问题描述】
给在一个神秘的国度,有一种多拿多得的疯狂游戏,某日大壮去参赛,在规定区域内里面有 N(N≤100)
堆金币,第i堆金币的总重量和总价值分别是��,��(1≤ ��,��≤100)。大壮有一个承重量为T(T≤1000)
的背包,但并不一定有办法将全部的金币都装进去。但肯定想装走尽可能多价值的金币。所有金币都
可以随意分割,分割完的金币重量价值比(也就是单位价格)不变。请问大壮最多可以拿走多少价值
的金币?
【输入描述】
第一行两个整数 N,T。
接下来 N 行,每行两个整数��,��。
【输出描述】
一个实数表示答案,输出两位小数。
【输入样例】
4 50
10 60
20 100
30 120
15 45
【输出样例】
240.00
【数据规模】
100%的数据满足 1 ≤ � < 10
2,��,��(1≤ ��,��≤100),1 ≤ � < 10
3。

#include 
#include 
using namespace std;

struct gold{
    int m;
    int v;
};
gold g[101];

int n,t,j;
double total_v;

bool compare(gold a,gold b){
    if ((double)a.v/a.m>(double)b.v/b.m)
    {
        return true;
    }
    return false;
}

int main()
{
    cin >> n >> t;
    for (int i = 0; i < n; ++i)
    {
        cin >> g[i].m >> g[i].v;
    }
    sort(g,g+n,compare);

    while(t-g[j].m>0){
        t-=g[j].m;
        total_v+=g[j].v;
        j++;
    }
    if (t!=0)
    {
        //说明还有空间
        total_v+= (double)g[j].v/g[j].m*t;
    }
    t=0;
    cout << total_v << endl;

    return 0;
}

第四题

试题编号:
试题名称:
时间限制: 1.0s
内存限制: 128.0MB
【问题描述】
小聪最近学会了一个数组魔法,她会在 n×n 二维数组上将一个奇数阶方阵按照顺时针或者逆时针旋
转 90 度。
首先,小聪会把 1 到 n
2 的正整数按照从左往右,从上至下的顺序填入初始的二维数组中,然后她会施
放一些简易的魔法。
小聪现在提供给你她的魔法执行顺序,想让你来告诉她魔法按次执行完毕后的二维数组。
【输入描述】
输第一行两个整数 n,m,表示方阵大小和魔法施放次数。
接下来 m 行,每行 4 个整数 x,y,r,z,表示在这次魔法中,小聪会把以第 x 行第 y 列为中心的 2r+1 阶
方阵按照某种时针方向旋转,其中 z=0 表示顺时针,z=1 表示逆时针。
【输出描述】
输出 n 行,每行 n 个用空格隔开的数,表示最终所得的方阵。 【输入样例】
5 4
2 2 1 0
3 3 1 1
4 4 1 0
3 3 2 1
【输出样例】
5 10 3 18 15
4 19 8 17 20
1 14 23 24 25
6 9 2 7 22
11 12 13 16 21
【数据规模】
对于 50%的数据,满足 r=1
对于 100%的数据 1≤n,m≤100,满足 1≤x−r≤x+r≤n,1≤y−r≤y+r≤n。

第五题

试题编号:
试题名称:购物计划
时间限制: 1.0s
内存限制: 128.0MB
【问题描述】
共有 4 种硬币。面值分别为 c1,c2,c3,c4。
某人去商店买东西,去了 n 次,对于每次购买,他带了 di 枚 i 种硬币,想购买 s 的价值的东西。请问
每次有多少种付款方法。
【输入描述】
输入的第一行是五个整数,分别代表 c1,c2,c3,c4,n。
接下来 n 行,每行有五个整数,描述一次购买,分别代表 d1,d2,d3,d4,s。
【输出描述】
对于每次购买,输出一行一个整数代表答案。 【输入样例】
1 2 5 10 2
3 2 3 1 10
1000 2 2 2 900
【输出样例】
4
27
【数据规模】
对于 100% 的数据,保证 1≤ci,di≤10
3,1≤s≤10
4 ,1≤n≤1000。

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