天天看点

PAT练习笔记——3.2 查找元素第3章 入门篇(1)——入门模拟

2019年9月PAT - 练习笔记——3.2

以下页码标注的是阅读器中实际页码,而不是书本身自印的页码。

第3章 入门篇(1)——入门模拟

3.2 查找元素

目录

  1. B1041 考试座位号
  2. B1004 成绩排名
  3. B1028 人口普查
  4. B1032 挖掘机技术哪家强
  5. A1011 World Cup Betting
  6. A1006 Sign In and Sign Out
  7. A1036 Boys VS Girls
  1. B1041 考试座位号

    每个 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
               
    1. 我的
      #include <iostream>
      #include <string>
      
      using namespace std;
      
      int main(void)
      {
      	int n = 0;
      	cin >> n;
      	
      	string numbers[1001];
      	int seats[1001];
      	for (int i = 0;i < n;++i) {
      		string number = "";
      		int seat1 = 0, seat2 = 0;
      		cin >> number >> seat1 >> seat2;
      		
      		numbers[seat1] = number;
      		seats[seat1] = seat2;
      	}
      	
      	int m = 0;
      	cin >> m;
      	for (int i = 0;i < m;++i) {
      		int seat = 0;
      		cin >> seat;
      		cout << numbers[seat] << " " << seats[seat] << endl;
      	}
      	
      	return 0;
       }
                 
    2. 《算法笔记》P37

      可以用long long存准考证号

      可以用结构体把准考证号和考试座位号存一起

  2. B1004 成绩排名

    读入 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 <iostream>
      #include <string>
      
      using namespace std;
      
      int main(void)
      {
      	int n = 0;
      	cin >> n;
      	
      	int max = -1, min = 101;
      	string maxName = "", minName = "";
      	string maxNumber = "", minNumber = "";
      	for (int i = 0;i < n;++i) {
      		string name = "";
      		string number = "";
      		int score = 0;
      		cin >> name >> number >> score;
      		
      		if (score > max) {
      			max = score;
      			maxName = name;
      			maxNumber = number;
      		}
      		if (score < min) {
      			min = score;
      			minName = name;
      			minNumber = number;
      		}
      	}
      	cout << maxName << " " << maxNumber << endl;
      	cout << minName << " " << minNumber << endl;
      	
      	return 0;
       }
                 
    2. 《算法笔记》P38
  3. B1028 人口普查

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

    这里确保每个输入的日期都是合法的,但不一定是合理的——假设已知镇上没有超过 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
               
    1. 我的
      #include <iostream>
      #include <string>
      
      using namespace std;
      
      int main(void)
      {
      	int n = 0;
      	cin >> n;
      	
      	int count = 0;
      	string oldest = "", youngest = "";
      	string max = "2014/09/06", min = "1814/09/06";
      	string maxNow = "1814/09/05", minNow = "2014/09/07";
      	for (int i = 0;i < n;++i) {
      		string name = "", date = "";
      		cin >> name >> date;
      		
      		if (min <= date && date <= max) {
      			++count;
      			if (date > maxNow) {
      				maxNow = date;
      				oldest = name;
      			}
      			if (date < minNow) {
      				minNow = date;
      				youngest = name;
      			}
      		}
      	}
          if (count) cout << count << " " << youngest << " " << oldest;
          else cout << 0;
      	
      	return 0;
       }
                 
    2. 《算法笔记》P41

      参考代码用int分别存年月日,我觉得麻烦了

  4. B1032 挖掘机技术哪家强

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

    输入格式:

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

    输出格式:

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

    输入样例:

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

    输出样例:

    2 150
               
    1. 我的
      #include <iostream>
      
      using namespace std;
      
      int main(void)
      {
      	int n = 0;
      	cin >> n;
      	
      	int maxNumber = 0;
      	int scores[100001] = {0};
      	for (int i = 0;i < n;++i) {
      		int number = 0, score = 0;
      		cin >> number >> score;
      		scores[number] += score;
      		
      		if (scores[number] > scores[maxNumber])	maxNumber = number;
      	}
      	cout << maxNumber << " " << scores[maxNumber];
      	
      	return 0;
       }
                 
    2. 《算法笔记》P42
  5. A1011 World Cup Betting

    With the 2010 FIFA World Cup running, football fans the world over were becoming increasingly excited as the best players from the best teams doing battles for the World Cup trophy in South Africa. Similarly, football betting fans were putting their money where their mouths were, by laying all manner of World Cup bets.

    Chinese Football Lottery provided a “Triple Winning” game. The rule of winning was simple: first select any three of the games. Then for each selected game, bet on one of the three possible results – namely

    W

    for win,

    T

    for tie, and

    L

    for lose. There was an odd assigned to each result. The winner’s odd would be the product of the three odds times 65%.

    For example, 3 games’ odds are given as the following:

    W    T    L
    1.1  2.5  1.7
    1.2  3.1  1.6
    4.1  1.2  1.1
               
    To obtain the maximum profit, one must buy

    W

    for the 3rd game,

    T

    for the 2nd game, and

    T

    for the 1st game. If each bet takes 2 yuans, then the maximum profit would be (4.1×3.1×2.5×65%−1)×2=39.31 yuans (accurate up to 2 decimal places).

    Input Specification:

    Each input file contains one test case. Each case contains the betting information of 3 games. Each game occupies a line with three distinct odds corresponding to

    W

    ,

    T

    and

    L

    .

    Output Specification:

    For each test case, print in one line the best bet of each game, and the maximum profit accurate up to 2 decimal places. The characters and the number must be separated by one space.

    Sample Input:

    1.1 2.5 1.7
    1.2 3.1 1.6
    4.1 1.2 1.1
               

    Sample Output:

    T T W 39.31
               
    1. 我的
      #include <iostream>
      #include <iomanip>
      
      using namespace std;
      
      int main(void)
      {
      	float profit = 1;
      	for (int i = 0;i < 3;++i) {
      		float w = 0, t = 0, lo = 0;
      		cin >> w >> t >> lo;
      		
      		float odd = w;
      		char bet = 'W';
      		if (t >= w && t >= lo) {
      			odd = t;
      			bet = 'T';
      		}
      		if (lo >= w && lo >= t) {
      			odd = lo;
      			bet = 'L';
      		}
      		profit *= odd;
      		cout << bet << " "; 
      	}
      	cout << setiosflags(ios::fixed) << setprecision(2) << (profit * 0.65 - 1) * 2;
      	
      	return 0;
       }
                 
    2. 《算法笔记》P44
  6. A1006 Sign In and Sign Out

    At the beginning of every day, the first person who signs in the computer room will unlock the door, and the last one who signs out will lock the door. Given the records of signing in’s and out’s, you are supposed to find the ones who have unlocked and locked the door on that day.

    Input Specification:

    Each input file contains one test case. Each case contains the records for one day. The case starts with a positive integer M, which is the total number of records, followed by M lines, each in the format
    ID_number Sign_in_time Sign_out_time
               
    where times are given in the format

    HH:MM:SS

    , and

    ID_number

    is a string with no more than 15 characters.

    Output Specification:

    For each test case, output in one line the ID numbers of the persons who have unlocked and locked the door on that day. The two ID numbers must be separated by one space.

    Note: It is guaranteed that the records are consistent. That is, the sign in time must be earlier than the sign out time for each person, and there are no two persons sign in or out at the same moment.

    Sample Input:

    3
    CS301111 15:30:28 17:00:10
    SC3021234 08:00:00 11:25:25
    CS301133 21:45:00 21:58:40
               

    Sample Output:

    SC3021234 CS301133
               
    1. 我的
      #include <iostream>
      
      using namespace std;
      
      int main(void)
      {
      	int m = 0;
      	cin >> m;
      	
      	string min = "24:00:00", max = "";
      	string minID = "", maxID = "";
      	for (int i = 0;i < m;++i) {
      		string ID = "", in = "", out = "";
      		cin >> ID >> in >> out;
      		
      		if (in < min) {
      			min = in;
      			minID = ID;
      		}
      		if (out > max) {
      			max = out;
      			maxID = ID;
      		}
      	}
      	cout << minID << " " << maxID;
      		
      	return 0;
       }
                 
    2. 《算法笔记》P46

      参考代码用int存时间,我觉得麻烦了

  7. A1036 Boys VS Girls

    This time you are asked to tell the difference between the lowest grade of all the male students and the highest grade of all the female students.

    Input Specification:

    Each input file contains one test case. Each case contains a positive integer N, followed by N lines of student information. Each line contains a student’s

    name

    ,

    gender

    ,

    ID

    and

    grade

    , separated by a space, where

    name

    and

    ID

    are strings of no more than 10 characters with no space,

    gender

    is either

    F

    (female) or

    M

    (male), and

    grade

    is an integer between 0 and 100. It is guaranteed that all the grades are distinct.

    Output Specification:

    For each test case, output in 3 lines. The first line gives the name and ID of the female student with the highest grade, and the second line gives that of the male student with the lowest grade. The third line gives the difference gradeF−gradeM. If one such kind of student is missing, output

    Absent

    in the corresponding line, and output

    NA

    in the third line instead.

    Sample Input 1:

    3
    Joe M Math990112 89
    Mike M CS991301 100
    Mary F EE990830 95
               

    Sample Output 1:

    Mary EE990830
    Joe Math990112
    6
               

    Sample Input 2:

    1
    Jean M AA980920 60
               

    Sample Output 2:

    Absent
    Jean AA980920
    NA
               
    1. 我的
      #include <iostream>
      #include <string>
      
      using namespace std;
      
      int main(void)
      {
      	int n = 0;
      	cin >> n;
      	
      	int min = 101, max = -1;
      	string minName = "", maxName = "";
      	string minID = "", maxID = "";
      	for (int i = 0;i < n;++i) {
      		string name = "", ID = "";
      		char gender = 0;
      		int grade = 0;
      		cin >> name >> gender >> ID >> grade;
      		
      		if (gender == 'F' && grade > max) {
      			max = grade;
      			maxName = name;
      			maxID = ID;
      		}
      		else if (gender == 'M' && grade < min) {
      			min = grade;
      			minName = name;
      			minID = ID;
      		}
      	}
      	if (minName != "" && maxName != "") cout << maxName << " " << maxID << endl << minName << " " << minID << endl << max - min;
      	else {
      		if (maxName == "") cout << "Absent" << endl;
      		else cout << maxName << " " << maxID << endl;
      		
      		if (minName == "") cout << "Absent" << endl;
      		else cout << minName << " " << minID << endl;
              cout << "NA";
      	}
      	
      	return 0;
       }
                 
    2. 《算法笔记》P48