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", ×);//输入总的结构体的个数 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", ×);//输入考生个数 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", ×); 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", ×); 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; }