快捷搜索: 王者荣耀 脱发

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);
    }
}
经验分享 程序员 微信小程序 职场和发展