【Java 决赛】2020全国高校计算机能力挑战赛

题目1

某高校食堂开办了一个自助餐厅,使用智能餐盘和自动结算,计算学生餐费。
智能餐盘能够识别所打菜品类型,量,单价(计价单位为:元/100克)。
食堂计划以每道菜、汤独立定价;主食200克以内免费, 200克以上部分收费( 如果打了多道主食,依据输入次序累计免费200克以下部分)。
为鼓励学生健康饮食,学校鼓励学生联网分享运动信息,参 照计步数进行阶梯折扣, 0-5999步不打折,6000-9999步为9折, 10000步以上均为8折。试根据餐盘提供的信息和学生的计步数,计算该同学某次用.餐的最终餐费。

输入说明:

第1行为该生本次用餐所打的所有饭菜种类数量N(0<N≤10) :
第2行起每一行顺序为盘中每道饭菜的信息,包括:类型(M:荤菜/N:素菜/R:主食/S:汤)、重量(克,整数)、
单价(元/100克)
第N+ 2行为该同学的计步数。
输出说明:最终餐费(保留两位小数)

输入样例:

6
M 50 3.00
V 100 1.50
M 50 5.00
V 150 2.00
R 150 0.10
S 150 0.00
8754

输出样例:
7.65

package org.example;/**
 * Copyright (C), 2019-2020
 * author  candy_chen
 * date   2020/12/20 13:40
 * version 1.0
 * Description: 测试
 */

import java.util.ArrayList;
import java.util.Scanner;

public class Main_01 {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        sc.nextLine();
        //存储的数据的
        ArrayList<String[]> list = new ArrayList<>();
        for (int i = 0; i < N; i++) {
            String[] s = sc.nextLine().split(" ");
            list.add(s);
        }
        //存储步数
        int num = sc.nextInt();

        //总价格
        double sum = 0;
        //折扣
        double count = 1;
        if (num < 5999) {
            count = 1;
        } else if (num < 9999 && num > 6000) {
            count = 0.9;
        } else if (num > 10000) {
            count = 0.8;
        }
        for (String[] arr : list) {
            if (arr[0].equals("R")) {
                if (Integer.valueOf(arr[1]) <= 200) {
                    continue;
                }else {
                    sum +=( (Integer.valueOf(arr[1]) - 200) * Double.valueOf(arr[2])) / 100;
                }
            } else {
                sum += (Integer.valueOf(arr[1]) * Double.valueOf(arr[2]) / 100);
            }
        }
        double res = sum * count;
        System.out.println(String.format("%.2f", res));
    }
}

题目2

给定非负整数序列的前两项a1, a2 ,请按如下规则产生符合要求整数序列:若当前序列的最后2项的乘积为5位数以内的数,则把积作为其后继项;若当前序列的最后两项之积为5位数以上的数,则把该数分别对10000求余和求商,把余和商作为其后继两项。请输出所产生的前10项数字。
输入说明:两个整数a1, a2.
输出说明:输出符合条件的前10项数字。数字之间用空格隔开,所有数据输出后换行

输入样例:
48
输出样例:
32 256 8192 7152 209 4768 149 432 71 672

package org.example;/**
 * Copyright (C), 2019-2020
 * author  candy_chen
 * date   2020/12/20 13:41
 * version 1.0
 * Description: 测试
 */

import java.util.Scanner;

public class Main_02 {
    public static void main(String[] args) {
        Scanner cin = new Scanner(System.in);
        int a = cin.nextInt(),b = cin.nextInt();
        int ans = 0;
        int m = 10;
        while (m > 0){
            ans = a * b;
            if (ans < 10000){
                a = b;
                b = ans;
                System.out.print(b + " ");
                m--;
            }else if (ans > 10000){
                a = ans % 10000;
                System.out.print(a + " ");
                m--;
                if(m > 0){
                    b = ans / 10000;
                    System.out.print(b + " ");
                    m--;
                }
            }
        }
    }
}

题目3

给定一个含有N个整数的序列( 2<N<10000 ) ,输入-一个整数K ( K<N) ,从K的位置把该序列分为2个部分,分别为1到K, K+ 1到N。然后在1到K部分执行从小到大排序;在K+ 1到N部分执行从大到小排序(即前一一部分从小到大,后-部分从大到小) ;然后再从K-2位置把数据分为2个部分,继续执行上述操作。之后输出该整数序列。

输入说明:第一行是正整数N ( 2<N<1000) , 正整数K(2<=K <N),
第二行依次输入这N个数。
输出说明:经过操作后的这N个数的序列。数字之间用空格隔开,所有效据输出后换行

输入样例:
10 5
11 2 3 4 5 6 12 8 9 10
输出样例:
2 3 4 12 11 10 9 8 6 5

package org.example;/**
 * Copyright (C), 2019-2020
 * author  candy_chen
 * date   2020/12/20 13:41
 * version 1.0
 * Description: 测试
 */

import java.util.Scanner;

/**
 *
 */
public class Main_03 {

    public static void swap(int[] a,int i,int j){
        int tmp = a[i];
        a[i] = a[j];
        a[j] = tmp;
    }
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int k = sc.nextInt();
        int[] arr = new int[n];
        for (int i = 0; i < n; i++) {
            arr[i] = sc.nextInt();
        }
        for (int i = k - 1; i > 0 ; i--) {
            for (int j = 0; j < i; j++) {
                if (arr[j] > arr[j + 1]){
                    swap(arr,j,j + 1);
                }
            }
        }
        k = k -2;
        for(int i = n - 1;i > k;i--){
            for (int j = 0;j < i;j++){
                if(arr[j] > arr[i]){
                    swap(arr,j,j+1);
                }
            }
        }
        for (int i = n - 1;i > k;i--){
            for(int j = k;j < i;j++){
                if (arr[j] < arr[j+ 1]){
                    swap(arr,j,j+ 1);
                }
            }
        }
        for (int e : arr) {
            System.out.print(e + " ");
        }
    }
}

题目4

某字符串描述了一个单链表,但并非严格按照节点的顺序关系描述,两个节点的前后关系描述如下:
每个中括号中包含一个节点及 其后继节点,节点名称由小写字母和数字组成。之间由’->’ 连接。表示前驱后继关系,如[node1-> node2][node3- > node4]node2-> node3]表示链表节点的顺序为node1-> node2-> node3-> node4 ;
输入一个字符串,给定一个节点名称。求该节点到链表头尾的距离长度。

输入说明:
第一行为单链表的描述字符串(长度s200) ,第二行为给定节点的名称; .

输出说明:
该节点到链表头、尾的距离长度,空格隔开;

输入样例:
[node1-> node2] [node3-> node4] [node2->node3]
node2

输出样例:
12

第四题投机取巧了一下。。。不知道结果咋样

package org.example;/**
 * Copyright (C), 2019-2020
 * author  candy_chen
 * date   2020/12/20 13:41
 * version 1.0
 * Description: 测试
 */

import java.util.Scanner;

public class Main_04 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String s1 = sc.nextLine();
        String s2 = sc.nextLine();
        int des = (int)s2.charAt(4);
        int max = Integer.MIN_VALUE;
        int min = Integer.MAX_VALUE;
        for (int i = 0; i < s1.length(); i++) {
            if (s1.charAt(i) >= '0' && s1.charAt(i) <= '9'){
                int tmp = (int) s1.charAt(i);
                if (tmp > max){
                    max = tmp;
                }
                if (tmp < min){
                    min = tmp;
                }
            }
        }
        System.out.println((des - min) + " " + (max -des));
    }
}

题目5

公交车换乘城市推出了优惠换乘活动,乘客第一-次在公交车 上打卡后,可以免费同站台换乘2次,现给出城市中多条公交路线。每个公交站有一一个编号,编号由一个字母和- -位或两位数字组成。给定某乘客的出发站.问2次换乘,最多可以经过多少个不同的公交站。

输入说明:第一行是一个整数N ( 1<N<=20 )和出发站编号,其中N表示公交路线数量。接下来N行,每行表示一条公交路线的所有停靠站编号(单条线路的停靠站数量少于20) , 中间用空格隔开。已知公交线路不会形成环线。

输出说明: 一个整数,表示不超过2次换乘,最多可以经过多少个不同的公交站。

输入样例:
3 C3
A1 A2 A3
C1 C2 C3 C4
A2 B1 C2 D1

输出样例;
5


不会、、、、、

题目6

仓库中有m袋大米,它们的重是互不相同,分别N1. N2、… Nm千克,东方学校食堂需要大米N干克,需要从仓库中挑选若干袋大米,重最之和恰好N千克,请统计一共有多少种组合方法,使得重量符合要求。

输入说明:第一行输入两个正整数,分别为m ( m<=60。为大米袋数)和N ( N<= 1000 ,为需要大米重量) ,第二行输入m个正整数,表示m袋大米重量(已知每袋大米重量不超过200千克)

输出说明:选择若干袋大米,重量恰好为N的不同组合方法总数

输入样例:
5 20
3 4 11 2 9

输出样例:
2

(第六题参赛的时候没写出来,后来庄小炎给的代码)

package org.example;/**
 * Copyright (C), 2019-2020
 * author  candy_chen
 * date   2020/12/20 13:41
 * version 1.0
 * Description: 测试
 */

import java.util.*;

public class Main_06 {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int m = sc.nextInt();
        int target = sc.nextInt();
        int[] num = new int[m];
        for (int i = 0; i < m; i++) {
            num[i] = sc.nextInt();
        }
        Arrays.sort(num);
        ArrayList<ArrayList<Integer>> arrayLists = combinationSum2(num, target);
        System.out.println(arrayLists.size());
    }

    static ArrayList<ArrayList<Integer>> list = new ArrayList<>();

    public static ArrayList<ArrayList<Integer>> combinationSum2(int[] num, int target) {
        ArrayList<Integer> ls = new ArrayList<>();
        if (num == null || num.length == 0) {
            return list;
        }
        Arrays.sort(num);
        dfs(num, 0, target, ls);
        return list;
    }

    private static void dfs(int[] arr, int index, int sum, ArrayList<Integer> ls) {
        if (sum < 0) {
            return;
        }

        if (sum == 0) {
            if (!list.contains(ls)) {
                list.add(new ArrayList<>(ls));
            }
            return;
        }

        for (int i = index; i < arr.length; i++) {
            ls.add(arr[i]);
            //此处从i+1开始
            dfs(arr, i + 1, sum - arr[i], ls);
            ls.remove(ls.size() - 1);
        }
    }
}

posted @ 2020-12-20 16:01  your_棒棒糖  阅读(236)  评论(0)    收藏  举报