2020年全国高校计算机能力挑战赛决赛JAVA真题

1.第一题:
输入的第一行是一个整数N,表示接下来有N行(就是一个学生打了N次菜),每一行是3个数据,分别是一个字符–>表示食物的类型(M是肉、V是蔬菜、R是主食,主食有200克的免费额度,多于200克的话先买的先免费、S代表汤)、一个int–>表示打了多少克菜、一个float-- >表示这个菜的单价(元/100克)。
然后第N+2行还有一个float代表这个学生打好饭之后吃饭的桌子,这个桌子总的食物剩余率,如果剩余率P在(0,0.2)之间,那么这个学生的总价格就可以优惠0.2-P。
然后是输入样例,大概是这样:
5
M 100 3.00
V 100 2.00
M 200 2.00
R 150 2.00
S 100 0.00
0.1
输出:8.10(保留小数点后面2位)

实际的描述比这还要复杂,是一个什么智能餐盘和智能餐台的模拟来着


然后是第二题:
输入两个整数a和b,要你返回一个序列,这个序列有10个数据,每个数据是前两个数据的乘积,如果这个数据超过了5位数,那这个数据和后面的所有数据都是0。
输入样例:
4 8
输出样例:
32 256 8192 0 0 0 0 0 0 0


然后是第3题:
先输入两个整数N和K,N表示数组的长度,K表示第K个元素(从1开始数),然后第二行就是这N个数据。
然后就是要按题目要求进行变换:
首先,把这个数组从1到K按照由小到大排序,从K到N按照由大到小排序

然后对着两个部分的每个部分进行二分排序,具体是对于某一个部分,将它的前一步按从小到大排序,将它的后一半按照从大到小排序,一半的取值向上取整(从测试用例可以看出),然后对每一半再次调用这个方法。
输入样例:
10 5
1 2 3 4 5 6 7 8 9 10
输出样例:
1 2 3 5 4 8 9 10 7 6

没什么好说的,就是考前粘贴了一个从大到小的冒泡排序算法,可是这个算法是对一整个数组进行排序的,我需要改写成对从left到right-1进行排序。所以对于二重循环的终止条件磨蹭了半天。

然后这题是我最后写的一题,代码还在Main类里,粘贴出来如下:

import java.util.Scanner;

public class Main{
    public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        int n=scanner.nextInt(),k=scanner.nextInt();
        int[] data=new int[n];
        for (int i=0;i<n;i++){
            data[i]=scanner.nextInt();
        }
        xiaoToda(data,0,k);
        daToxiao(data,k,n);
        erfen(data,0,k-1);
        erfen(data,k,n-1);
        for (int i=0;i<n;i++)
            System.out.printf("%d ",data[i]);
    }

    private static void erfen(int[] data,int left,int right) {

        int half=(right-left+1)/2+1;
        if (half==1||half==2)return;
        xiaoToda(data,left,left+half);
        daToxiao(data,left+half,right+1);
        erfen(data,left,left+half-1);
        erfen(data,left+half,right);
    }

    public static void daToxiao(int[] arr,int index,int length){
        int temp;
        for(int i=index;i<length;i++){
            for(int j=index;j<length-(i-index)-1;j++){
                if(arr[j]<arr[j+1]){
                    temp = arr[j];

                    arr[j] = arr[j+1];

                    arr[j+1] = temp;

                }

            }

        }
    }

    public static void xiaoToda(int[] arr,int index,int length){
        int temp;
        for(int i=index;i<length;i++){
            for(int j=index;j<length-(i-index)-1;j++){
                if(arr[j]>arr[j+1]){
                    temp = arr[j];

                    arr[j] = arr[j+1];

                    arr[j+1] = temp;

                }

            }

        }
    }
}


第4题:
输入是一行字符串(长度<=200),它描述了单链表的形态,第二行是一个int表示第A个结点,要你输出两个整数,分别表示这个结点到首节点和到尾节点的距离
输入样例:
[node1->node2][node3->node4][node2->node3]
2
输出样例:
1 3

这题是用hash表和类似并查集的思路就能写出来,但是首先要对字符串用正则表达式进行预处理,我不会啊。在split的模式匹配字符串里填了几次也截取不出东西就放弃了,明明看了正则表达式的入门视频还是不会用,唉。


第5题:
这题是什么鬼啊喂(#`O′),随便来个最短路径就行了把,这题比最短路径还要难1.5倍的样子,根本没有思路

题目第一行输入3个东西,一个int N,表示接下来有N行,每行表示一条公交路线图、一个字符串表示起始站点、还有一个字符串表示目的站点。要求你输出一个整数表示起始站点到目的站点的距离
输入样例:
4 A3 C3
A1 A2 A3
C1 C2 C3 C4
A2 B1 C2 D1
A2 C3
输出样例:
3

这题怎么做嘛,是要用邻接矩阵还是关联矩阵,A1是一个字符串怎么把它映射成二维数组的下标嘛。对于这种没学过的题目也就不指望能拿分了,事后涨涨见识就行了。


第6题
先输入一个int N,表示公司有N个员工,然后是不知道多少行,每行两个int a和b,表示a号员工和b号员工是好朋友,以两个0表示输入完毕。现在公司要玩“铁三角”的游戏,随机选出3明员工,让你输出一个int,表示这3名员工两两互为好朋友的情况有多少种?
输入样例:
忘记了

反正这题可以用邻接矩阵来做,然后3重for循环,还要用一个大小为N+N-1+N-2+1的哈希表来避免123和132算两种情况。

  • 2
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值