欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-02-17 11:59:04
...

含泪总结,感觉今年的题比其他语言去年的题要难一点(java去年的题没看到网上有人发),然后就是第一题比第二题要难。
再然后,忘了是第二题还是第三题需要在输出完一个数组之后再输出一个换行符,然后我第三题是在最后一分钟写完的,我一看时间显示15:30慌慌张张地提交居然提交上了,然后突然想到是不是需要输出一个换行符。如果确实是第3题需要换行那我就只做出了3题,如果是第二题需要换行那我就做出了4题,因为无论第二题需不需要换行我都是认真读完了题目的应该不会有问题,难受啊。
下面是依稀记得的题目描述,连截图的时间都没有:

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

如果是这题需要换行就好了,那我就能对4题,如果是下一题需要换行那我就只能对3题了。为什么第3题慌慌张张压线才交,因为我中间花了一分钟到第4题写了一句System.out.println(3); 现在想想真是捡了芝麻丢了西瓜,我要是把这一分钟拿来看看第三题的题目就好了,泪目。。


然后是第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算两种情况。

现在只希望第3题能有分,然后混个3等奖。

有同考java的兄弟记得的告诉我一下是第二题还是第三题需要换行,感激不尽!
泪目。