PAT乙级(查找元素) 1041、1004、1028、1032

简介: PAT乙级(查找元素) 1041、1004、1028、1032

1041 考试座位号

每个 PAT 考生在参加考试时都会被分配两个座位号,一个是试机座位,一个是考试座位。正常情况下,考生在入场时先得到试机座位号码,入座进入试机状态后,系统会显示该考生的考试座位号码,考试时考生需要换到考试座位就座。但有些考生迟到了,试机已经结束,他们只能拿着领到的试机座位号码求助于你,从后台查出他们的考试座位号码。

输入格式:

输入第一行给出一个正整数 N(≤1000),随后 N 行,每行给出一个考生的信息:准考证号、试机座位号、考试座位号。其中,准考证号由16 位数字组成,座位从 1 到 N 编号。输入保证每个人的准考证号都不同,并且任何时候都不会把两个人分配到同一个座位上。

考生信息之后,给出一个正整数 M(≤N),随后一行中给出 M 个待查询的试机座位号码,以空格分隔。

输出格式:

对应每个需要查询的试机座位号码,在一行中输出对应考生的准考证号和考试座位号码,中间用 1 个空格分隔。

输入样例:

4
3310120150912233 2 4
3310120150912119 4 1
3310120150912126 1 3
3310120150912002 3 2
2
3 4

输出样例:

3310120150912002 2
3310120150912119 1

代码:

(1)循环版本:

#include<stdio.h>
int main() {
    struct Info {
        long long number;//准考证号
        int test;//试机座位号
        int exam;//考场座位号
    }info[1000];
    int times, i, count, j;
    int find[1000];
    scanf("%d", &times);//输入总的结构体的个数
    for (i = 0; i < times; i++) {//存入准考证号、试机座位号、考试座位号
        scanf("%lld%d%d", &info[i].number, &info[i].test, &info[i].exam);
    }
    scanf("%d", &count);//输入要查找几个元素
    for (i = 0; i < count; i++) {//存入要寻找的试机座位号
        scanf("%d", &find[i]);
    }
    for (i = 0; i < count; i++) {//遍历要寻找的试机座位号
        for (j = 0; j < times; j++) {//遍历info结构体中的test元素
            if (find[i] == info[j].test) {//如果相等,则输出该结构体中的其他元素
                printf("%lld %d\n", info[j].number, info[j].exam);
            }
        }
    }
    return 0;
}

(2)不需要循环版本:

因为每个人试机座位号都不同,因此,可以将试机座位号作为结构体的下标进行存储,这样,仅需按照顺序输出存入的结构体下标即可

#include<stdio.h>
int main(){
    struct Info{//定义Info结构体
        long long number;//准考证号
        int exam;//考试座位号
    }info[1001];//数组元素要大于1000,因为接下来的试机座位号是1-1000的数字
    int num, i, times, exam1, test, count;
    long long number1;
    scanf("%d", &times);//输入考生个数
    for(i = 0; i < times; i++){
        scanf("%lld%d%d", &number1, &test, &exam1);
        info[test].number = number1;//存入试机座位号为小标的结构体
        info[test].exam = exam1;//存入试机座位号为小标的结构体
    }
    scanf("%d", &count);//输入查询个数
    for(i = 0; i < count; i++){
        scanf("%d", &test);//输入试机座位号
        printf("%lld %d\n", info[test].number, info[test].exam);//输出试机座位号为下标的结构体的元素
    }
    return 0;
}

1004 成绩排名

读入 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

代码:

(1)通过成绩作为数组下标方式输出

#include<stdio.h>
#include<string.h>
int main() {
    struct strudentInformation {
        //题中给出的是不超过10个字符的字符串
        //如果测试点是刚好10个字符,且设置为10个字符大小的字符数组
        //那就不会有空间放下计算机检测结束的'\0',从而引起数组越界
        char name[11];
        char num[11];
    }info[101];//数组的下标为数组数量-1,因此要用101个
    int times, i;
    int score, max = 0, min = 0;
    char name[11], num[11];
    scanf("%d", &times);
    for (i = 0; i < times; i++) {
        scanf("%s%s%d", name, num, &score);
        //题中给出的是互不相等的成绩,因此可以用成绩作为数组下标
        strcpy(info[score].name, name);
        strcpy(info[score].num, num);
        if (i == 0) {//初始化最大值最小值为第一个输入的学生成绩
            min = score;
            max = score;
        }
        else if (score > max) {
            max = score;
        }
        else if (score < min) {
            min = score;
        }
    }
    //输出最大最小值下标的结构体元素
    printf("%s %s\n", info[max].name, info[max].num);
    printf("%s %s", info[min].name, info[min].num);
    return 0;
}

(2)

#include<stdio.h>
struct Student{
    char name[15];
    char num[15];
    int score;
}temp, max, min;
//temp用来存放当前输入的学生信息,max用来存放成绩最高的学生信息,min用来存放成绩最低的学生信息
int main(){
    int times, i;//times存放学生个数,i用于遍历学生
    scanf("%d", &times);
    max.score = -1, min.score = 101;
    for (i = 0; i < times; i++){
        scanf("%s%s%d", temp.name, temp.num ,&temp.score);//存入当前输入的学生信息
        if (temp.score > max.score){//判断是否为成绩最高的学生
            max = temp;//如果是,覆盖数据
        }
        if (temp.score < min.score){//判断是否为成绩最低的学生
            min = temp;//如果是,覆盖数据
        }
    }
    printf("%s %s\n", max.name, max.num);
    printf("%s %s", min.name, min.num);
    return 0;
}

1028 人口普查

某城镇进行人口普查,得到了全体居民的生日。现请你写个程序,找出镇上最年长和最年轻的人。

这里确保每个输入的日期都是合法的,但不一定是合理的——假设已知镇上没有超过 200 岁的老人,而今天是 2014 年 9 月 6 日,所以超过 200 岁的生日和未出生的生日都是不合理的,应该被过滤掉。

输入格式:

输入在第一行给出正整数 N,取值在(0,105];随后 N 行,每行给出 1 个人的姓名(由不超过 5 个英文字母组成的字符串)、以及按 yyyy/mm/dd(即年/月/日)格式给出的生日。题目保证最年长和最年轻的人没有并列。

输出格式:

在一行中顺序输出有效生日的个数、最年长人和最年轻人的姓名,其间以空格分隔。

输入样例:

5
John 2001/05/12
Tom 1814/09/06
Ann 2121/01/30
James 1814/09/05
Steve 1967/11/20

输出样例:

3 Tom John

代码:

#include<stdio.h>
#include<stdbool.h>
//temp用于临时存放数据,oldest用于存放最年长,youngest用于存放最年轻
//validYoung和validOld分别存放合法的年龄上限和年龄下限
typedef struct Person {
    char name[10];
    int year, mouth, day;
}Per;
Per temp, oldest, youngest, validYoung, validOld;
bool less(Per a, Per b) {
    //先判断年份是否一样,如果一样则判断大小
    if (a.year != b.year) {
        return a.year <= b.year;
    }
    //年份一样,则判断月份大小
    else if (a.mouth != b.mouth) {
        return a.mouth <= b.mouth;
    }
    //年份和月份大小一样,则判断天
    else {
        return a.day <= b.day;
    }
}
bool more(Per a, Per b) {
    if (a.year != b.year) {
        return a.year >= b.year;
    }
    else if (a.mouth != b.mouth) {
        return a.mouth >= b.mouth;
    }
    else {
        return a.day >= b.day;
    }
}
int main() {
    int person, i, count = 0;//person为人数,i用于控制次数,count用于记录合法人数
    scanf("%d", &person);
    //设置最老的人和最年轻的人的初始年月日
    oldest.year = 2014, oldest.mouth = 9, oldest.day = 6;
    youngest.year = 1814, youngest.mouth = 9, youngest.day = 6;
    //设置合法的人的上限和下限
    validOld.year = 2014, validOld.mouth = 9, validOld.day = 6;
    validYoung.year = 1814, validYoung.mouth = 9, validYoung.day = 6;
    for (i = 0; i < person; i++) {
        scanf("%s %d/%d/%d", temp.name, &temp.year, &temp.mouth, &temp.day);
        //判断是否属于合法范围
        if (less(temp, validOld) && more(temp, validYoung)) {
            //合法人数+1
            count++;
            //如果比现存更年长的人年长,则更新数据
            if (less(temp, oldest)) {
                oldest = temp;
            }
            //如果比现存更年轻的人年轻,则更新数据
            if (more(temp, youngest)) {
                youngest = temp;
            }
        }
    }
    if (count == 0) {
        printf("0");
    }
    else {
        printf("%d %s %s", count, oldest.name, youngest.name);
    }
    return 0;
}

1032 挖掘机技术哪家强

为了用事实说明挖掘机技术到底哪家强,PAT 组织了一场挖掘机技能大赛。现请你根据比赛结果统计出技术最强的那个学校。

输入格式:

输入在第 1 行给出不超过 105 的正整数 N,即参赛人数。随后 N 行,每行给出一位参赛者的信息和成绩,包括其所代表的学校的编号(从 1 开始连续编号)、及其比赛成绩(百分制),中间以空格分隔。

输出格式:

在一行中给出总得分最高的学校的编号、及其总分,中间以空格分隔。题目保证答案唯一,没有并列。

输入样例:

6
3 65
2 80
1 100
2 70
3 40
3 0

输出样例:

2 150

代码:

#include<stdio.h>
int main(){
    //定义一个长度为100001空间的数组,测试点3可能有学校编号为100000的选手
    int totalScore[100001] = {0};
    //person为参赛人数,school为学校编号,score为成绩,i用于遍历数组
    int person, school, score, i;
    scanf("%d", &person);
    //遍历totalScore数组,并且在相应学校编号的数组元素存入成绩,并进行成绩累加
    for(i = 0; i < person; i++){
        scanf("%d%d", &school, &score);
        totalScore[school] += score;
    }
    //score用于记录最高成绩
    score = -1;
    //max记录最高成绩的学校编号
    int max = 1;
    //遍历totalScore数组,判断最高成绩的学校编号,并且输出其下标
    //并且参赛学校编号是由1开始连续的,所以最多仅需遍历person次就行
    for (i = 1; i <= person; i++){
        if (totalScore[i] > score){
            score = totalScore[i];
            max = i;
        }
    }
    printf("%d %d", max, score);
    return 0;
}
相关文章
|
Go 索引 Cloud Native
【刷题日记】34. 在排序数组中查找元素的第一个和最后一个位置
本次刷题日记的第 72 篇,力扣题为:34. 在排序数组中查找元素的第一个和最后一个位置 ,中等
|
存储
LeetCode题:88合并两个有序数组,283移动零,448找到所有数组中消失的数字
LeetCode题:88合并两个有序数组,283移动零,448找到所有数组中消失的数字
71 0
|
算法
【算法挨揍日记】day10——704. 二分查找、34. 在排序数组中查找元素的第一个和最后一个位置
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
363 0
1240:查找最接近的元素 2020-12-27
1240:查找最接近的元素 2020-12-27
重生之我是孔乙己——查找数组缺失元素的几种方法
重生之我是孔乙己——查找数组缺失元素的几种方法
81 0
|
索引
力扣34在排序数组中查找元素的第一个和最后一个位置:思路分析+图文详解+代码实现(最靠左索引,最靠右索引)
力扣34在排序数组中查找元素的第一个和最后一个位置:思路分析+图文详解+代码实现(最靠左索引,最靠右索引)
58 0
|
算法
每日一题—— 在排序数组中查找元素的第一个和最后一个位置
每日一题—— 在排序数组中查找元素的第一个和最后一个位置
|
算法 索引
【基础算法】浅浅刷个小题 # 搜索插入位置 # 各位相加 # 寻找数组的中心下标 #
【基础算法】浅浅刷个小题 # 搜索插入位置 # 各位相加 # 寻找数组的中心下标 #
|
存储 算法 测试技术
LeetCode算法小抄--O(1)时间下删除-查找数组中任意元素
LeetCode算法小抄--O(1)时间下删除-查找数组中任意元素