• 2020全国大学生计算机能力挑战赛模拟题(Java组)


    一、题解

    1、

    题目:

    统计1到N(含)之间所有立方数的个数,并输出这个数目。
    提示:立方数的个数,如8是2的立方数,27是3的立方数,9不是立方数。
    输入说明:一个整数N(N<100000);
    输出说明:立方数的个数
    输入样例:200
    输出样例:5

    题解:

    import java.util.Scanner;
    
    public class Main {
        public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);
            int N = scanner.nextInt();
            int index = 0;
            for (int i = 1; i <= N; i++) {
                if (isPow(i)) index++;
            }
            System.out.println(index);
            scanner.close();
        }
    
        private static boolean isPow(int i){
            if (i == 1)return true;
            for (int j = 1; j < i/2; j++) {
                if (Math.pow(j, 3) == i) return true;
            }
            return false;
        }
    
    }
    

    2、

    题目:

    统计整数区间[N, M] (N,M<100000)中所有非偶数的合数个数,并输出这个数。
    输入说明:两个整数N、M;
    输出说明:非偶数的合数个数
    输入样例:2 16
    输出样例:2

    题解:

    import java.util.Scanner;
    //所谓合数其实就是非素数
    public class Main {
        public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);
            int N = scanner.nextInt();
            int M = scanner.nextInt();
            int index = 0;
            for (int i = N; i<= M; i++){
                if (isJi(i)){
                    if (isHe(i))index++;
                }
            }
            System.out.println(index);
            scanner.close();
        }
    
        private static boolean isHe(int n){
            for (int i=2;i<=(int)Math.sqrt(n);i++){
                if (n%i==0) return true;
            }
            return false;
        }
    
        private static boolean isJi(int num){
            return num%2 != 0;
        }
    }
    

    3、

    题目:

    字母连连看,给定一个由小写英文字母组成的字符串(长度<1000),如果字符串中有两个连续的字母相同,则这两个字母可同时消除,并不断重复该操作,直到不能消除为止。请编程判断该字符串是否可以完全消除。
    输入说明:一个字符串。
    输出说明:如果可以完全消除,输出“YES”,如果不可以,输出消除后的结果。
    输入样例1:abacddcaba
    输出样例1:YES
    输入样例2:asdfghhgf
    输出样例2:asd

    题解:

    import java.util.Scanner;
    public class Main {
        public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);
            String str = scanner.next();
            char[] chars = str.toCharArray();
            for (int i = 0; i < chars.length - 1; i++) {
                char c1 = chars[i];
                char c2 = chars[i+1];
                if (c1 == c2){
                    char[] newChars = new char[chars.length-2];
                    for (int j = 0; j < chars.length-2; j++) {
                        if (j >= i){
                            newChars[j] = chars[j+2];
                        }else {
                            newChars[j] = chars[j];
                        }
                    }
                    chars = newChars;
                    i = -1;
                }
            }
            StringBuffer sb = new StringBuffer();
            if (chars.length == 0){
                System.out.println("YES");
            } else {
                for (char aChar : chars) {
                    sb.append(aChar);
                }
                System.out.println(sb.toString());
            }
            scanner.close();
        }
    }
    

    4、

    题目:

    由N(N<=10000)个整数组成的数组,其中连续K(K<=200)个元素构成一个区间,称为K区间。一个K区间中所有素数的和记为Sk,请计算整个数组中,所有K区间中的最大Sk值,并输出。
    输入说明:第一行是两个整数N和K,第二行输入N个数,表示数组中的元素。
    输出说明:最大Sk值
    输入样例:8 2
    12 23 27 34 19 17 45 8
    输出样例:36

    题解:

    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.List;
    import java.util.Scanner;
    
    public class Main {
        public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);
            int N = scanner.nextInt();
            int K = scanner.nextInt();
            int [] array = new int[N];
            for (int i = 0; i < N; i++) {
                array[i] = scanner.nextInt();
            }
            List<Integer> list = new ArrayList<>();
            for (int i = 0; i < array.length - K; i++) {
                int index = 0;
                for (int j = 0; j < K; j++) {
                    if (isPrime(array[i+j])){
                        index+=array[i+j];
                    }
                }
                list.add(index);
            }
            System.out.println(Collections.max(list));
            scanner.close();
        }
    
        private static boolean isPrime(int n){
            for (int i=2;i<=(int)Math.sqrt(n);i++){
                if (n%i==0) return false;
            }
            return true;
        }
    }
    

    5、

    题目:

    仓库新进了几批物资,只知道每批物资的数量和单价,请编写程序,按照每种物资的总价值,由高到低次序输出。
    输入说明:第1行 一个整数N,表明物资的批次数量
    第2-N+1行,每批物资的类别、数量及单价,中间用空格隔开,其中类别用A-Z加以区分。
    输出说明:按物资价值降序输出排序结果,每行输出一种物资。
    输入样例:5
    A 5 10.00
    B 3 2.00
    A 5 8.00
    B 3 2.50
    C 10 3.50
    输出样例:A 90.00
    C 35.00
    B 13.50

    题解:

    import java.util.*;
    
    public class Main {
        public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);
            int N = scanner.nextInt();
            Map<String,Double> map = new TreeMap<>();
            for (int i = 0; i < N; i++) {
                String type = scanner.next();
                int pi = scanner.nextInt();
                double price = scanner.nextDouble();
                double counts = pi * price;
                Double aDouble = map.get(type);
                if (aDouble != null){
                    counts+=aDouble;
                }
                map.put(type, counts);
            }
            Map<String, Double> stringDoubleMap = sortMap(map);
            stringDoubleMap.forEach((x,y) -> {
                System.out.print(x+" ");
                System.out.printf("%.2f
    ", y);
            });
            scanner.close();
        }
    
        private static Map<String,Double> sortMap(Map<String,Double> map){
            Map<String,Double> sortedMap = new LinkedHashMap<>();
            List<Map.Entry<String,Double>> entries = new ArrayList<>(map.entrySet());
            entries.sort(new MyComparator());
            Iterator<Map.Entry<String,Double>> iterator = entries.iterator();
            Map.Entry<String,Double> temp = null;
            while(iterator.hasNext()){
                temp = iterator.next();
                sortedMap.put(temp.getKey(), temp.getValue());
            }
            return sortedMap;
        }
        static class MyComparator implements Comparator<Map.Entry<String,Double>> {
    
            @Override
            public int compare(Map.Entry<String, Double> o1, Map.Entry<String, Double> o2) {
                return (int) (o2.getValue() - o1.getValue());
            }
        }
    }
    

    二、总结

    总体来看题目难度不大,基本都可以暴力解决,但是暴力解决拿不到满分。目前存在的问题还是只会使用暴力,对一些算法的使用不熟练,还是想着快速解决。

  • 相关阅读:
    Turtlebot3 OpenCR 机器人端刷固件方案(包括ROS1和ROS2)
    TurtleBot3自动驾驶Noetic模拟仿真项目 1.准备工作
    OpenManipulatorX Gazebo仿真(Noetic)
    Ned
    OpenMANIPULATORX Melodic ROS包安装
    TurtleBot3自动驾驶Noetic6.模拟隧道
    Turtlebot3 Noetic ROS包安装
    WEB网站发布服务器IIS报错问题终极解决方案,查到问题点
    理解javascript中的连续赋值
    C# webBrowser.DocumentCompleted 解决之道
  • 原文地址:https://www.cnblogs.com/zwscode/p/14284074.html
Copyright © 2020-2023  润新知