1004+1022+1038 PAT乙级

1004 成绩排名 (20 分)

读入 n(>0)名学生的姓名、学号、成绩,分别输出成绩最高和成绩最低学生的姓名和学号。

输入格式:

每个测试输入包含 1 个测试用例,格式为

第 1 行:正整数 n
第 2 行:第 1 个学生的姓名 学号 成绩
第 3 行:第 2 个学生的姓名 学号 成绩
  ... ... ...
第 n+1 行:第 n 个学生的姓名 学号 成绩

其中姓名学号均为不超过 10 个字符的字符串,成绩为 0 到 100 之间的一个整数,这里保证在一组测试用例中没有两个学生的成绩是相同的。

输出格式:

对每个测试用例输出 2 行,第 1 行是成绩最高学生的姓名和学号,第 2 行是成绩最低学生的姓名和学号,字符串间有 1 空格。

输入样例:

3
Joe Math990112 89
Mike CS991301 100
Mary EE990830 95

输出样例:

Mike CS991301
Joe Math990112

 

#include <iostream>
#include<bits/stdc++.h>
using namespace std;
struct Stu
{
    char name[11],xuehao[11];
    int grade;

} stu[101];
bool cmp(Stu a,Stu b)
{

    return a.grade<b.grade;

}
int main()
{
    int n;
    cin>>n;
    for(int i=1; i<=n; i++)
    {
        scanf("%s %s %d",stu[i].name,stu[i].xuehao,&stu[i].grade);//不能加换行符,否则会没有输出
    }

    sort(stu+1,stu+n+1,cmp);
    printf("%s %s\n",stu[n].name,stu[n].xuehao);
    printf("%s %s\n",stu[1].name,stu[1].xuehao);
    return 0;
}

 

1022 D进制的A+B (20 分)

输入两个非负 10 进制整数 A 和 B (≤2​30​​−1),输出 A+B 的 D (1<D≤10)进制数。

输入格式:

输入在一行中依次给出 3 个整数 A、B 和 D。

输出格式:

输出 A+B 的 D 进制数。

输入样例:

123 456 8

输出样例:

1103
#include <iostream>
#include<bits/stdc++.h>
using namespace std;

int main()
{
    int  digit[100000],d,top=0;
    long long  a,b,sum;//sum是否赋值0皆可
    cin>>a>>b>>d;
    sum=a+b;
    if(sum==0)
    {
        printf("0\n");
    }
    while(sum)
    {
        digit[top++]=sum%d;
        sum=sum/d;
    }
    for(int i=top-1; i>=0; i--)
    {
        cout<<digit[i];

    }
  // cout<<digit[0]<<endl;这样输入是不正确的,必须都在for循环中输出
    return 0;
}

 

1038 统计同成绩学生 (20 分)

本题要求读入 N 名学生的成绩,将获得某一给定分数的学生人数输出。

输入格式:

输入在第 1 行给出不超过 10​5​​ 的正整数 N,即学生总人数。随后一行给出 N 名学生的百分制整数成绩,中间以空格分隔。最后一行给出要查询的分数个数 K(不超过 N 的正整数),随后是 K 个分数,中间以空格分隔。

输出格式:

在一行中按查询顺序给出得分等于指定分数的学生人数,中间以空格分隔,但行末不得有多余空格。

输入样例:

10
60 75 90 55 75 99 82 90 75 50
3 75 90 88

输出样例:

3 2 0

 

#include <iostream>
#include<bits/stdc++.h>
using namespace std;

int main()
{
    int n,a[100001]= {0},ans[100001],grade;
    cin>>n;
    for(int i=0; i<n; i++)
    {
        cin>>grade;
        a[grade]++;
    }
    int k,cnt;
    cin>>k;
    for(int i=0; i<k; i++)
    {
        cin>>cnt;
        ans[i]=a[cnt];
    }
    for(int i=0; i<k-1; i++)
    {
        cout<<ans[i]<<" ";
    }
    cout<<ans[k-1]<<endl;
    return 0;
}

 总结:这三个题是昨天晚上学弟给我们讲的,虽然都是基础题,但方法很灵活,工作量也减少了。尤其是1038这道题,用到了Hash的思想,让我懂得了活学活用。

 

### 关于PAT乙级1120题的C++解法 以下是针对PAT乙级1120题的一个可能的C++实现方法。此题的核心在于处理输入数据并按照特定规则筛选符合条件的结果。 #### 题目解析 假设该题目涉及从一组数据中找出满足某些条件的数据项,并对其进行输出。以下是一个通用的解决思路: 1. **读取输入数据**:通过标准输入获取必要的参数和数据列表。 2. **定义筛选逻辑**:基于题目描述中的具体要求设计判断函数。 3. **遍历与匹配**:逐一检查每条数据是否符合筛选条件。 4. **输出结果**:如果找到符合条件的数据则立即输出;如果没有,则输出默认提示信息。 下面是具体的代码示例以及解释: ```cpp #include <iostream> #include <vector> using namespace std; int main() { int m, n, s; // 定义变量用于存储转发次数、间隔人数及起始位置 cin >> m >> n >> s; vector<string> participants(m); for(int i = 0; i < m; ++i){ cin >> participants[i]; } bool hasWinner = false; // 标记是否有获奖者 for(int i = s - 1; i < m; i += n){ // 调整索引以便正确映射到参与者数组 if(i >= 0 && i < m){ cout << participants[i] << endl; hasWinner = true; } } if(!hasWinner){ cout << "Keep going..."; } return 0; } ``` 上述程序实现了基本的功能需求,其中包含了几个重要部分: - 使用`vector<string>`来保存所有的参与人员名单[^1]。 - 设置布尔型标志位`hasWinner`用来跟踪是否存在任何合法的赢家。 - 对整个循环过程进行了优化以防止越界访问错误。 #### 注意事项 当实际编写此类竞赛类算法时需要注意边界情况和其他潜在陷阱,比如初始偏移量`s`的有效范围验证等问题都需要额外考虑进去。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值