【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);
}
}
}