PAT-L1-79 天梯赛的善良JAVA实现
题目详情
天梯赛是个善良的比赛。善良的命题组希望将题目难度控制在一个范围内,使得每个参赛的学生都有能做出来的题目,并且最厉害的学生也要非常努力才有可能得到高分。
于是命题组首先将编程能力划分成了 10^6 个等级(太疯狂了,这是假的),然后调查了每个参赛学生的编程能力。现在请你写个程序找出所有参赛学生的最小和最大能力值,给命题组作为出题的参考。
输入格式: 输入在第一行中给出一个正整数 N(≤2×10 ^4 ),即参赛学生的总数。随后一行给出 N 个不超过 10 ^6 的正整数,是参赛学生的能力值。
输出格式: 第一行输出所有参赛学生的最小能力值,以及具有这个能力值的学生人数。第二行输出所有参赛学生的最大能力值,以及具有这个能力值的学生人数。同行数字间以 1 个空格分隔,行首尾不得有多余空格。
输入样例:
10 86 75 233 888 666 75 886 888 75 666
输出样例:
75 3 888 2
解析 这题需要注意的是有时间限制,在200ms内,用java的话很容易超时,原因在于输入的学生个数可能达到10的4次方,测试用例中有一个蛮大的数,不处理输入的话,超时是必然的
对于输入数据的处理,除开Scanner 和 BufferedReader 外还有 StreamTokenizer
Java.io.StreamTokenizer 类接受一个输入流并将其解析为"tokens",从而允许一次读取一个令牌。 流标记器可以识别标识符、数字、带引号的字符串和各种注释样式。 它对于大量数据的输入获取效率比BufferedReader还要高
代码中初始化如下
StreamTokenizer sc = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
其中常用的方法如下
double nval —— 如果当前标记是数字,则此字段包含该数字的值
int nextToken() ——该方法从该分词器的输入流中解析下一个分词。
用StreamTokenizer获取数据的两件套就是: nextToken() 和 (int)sc.nval
注意:这个nval千万别写错了,我之前写成navl,找半天没发现问题在哪,血泪教训
//声明StreamTokenizer StreamTokenizer sc = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in))); //先获取下一个数 sc.nextToken(); //把获取的数字给转换为int型 int num = (int)sc.nval;
具体代码如下
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.StreamTokenizer; public class Main { public static void main(String[] args) throws IOException { StreamTokenizer sc = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in))); //先获取下一个数 sc.nextToken(); //把获取的数字给转换为int型 int num = (int)sc.nval; //初始最大,最小值 int max = 0, min = 99999; //分别为最大值的个数和最小值的个数 int m = 0, n = 0; //临时变量用于存储获取的值 int temp; for(int i = 0; i < num; i++){ //获取输入流中的数 sc.nextToken(); temp = (int) sc.nval; if(temp > max){ max = temp; m = 1; }else if(temp == max){ m++; } if(temp < min){ min = temp; n = 1; }else if(temp == min){ n++; } } System.out.println(min + " " + n); System.out.println(max + " " + m); } }