第四届“传智杯”全国大学生IT技能大赛-Java B组题解

A组原成绩

A-组原成绩

题目描述

花栗鼠科技大学(Hualishu University of Science and Technology, HUST)的计算机组成原理快要出分了。你现在需要计算你的组原成绩如何构成。

具体来说,组原成绩分为三部分,分别是平时出勤 t ,作业 h 和考试 e 。总成绩 w由如下公式计算:

w=t×20%+h×30%+e×50%

其中我们保证 0≤h,e,t≤100

现在你知道了你的组原考试的 t,h,e你希望计算你的总成绩。

由于教务系统的特殊性,最终成绩只能是整数,采取 直接去掉小数部分 的办法。

输入格式

一行三个整数,表示 t,h,e

输出格式

一行一个整数,为 w

输入输出样例

输入

50 50 100

输出

90

 分析:纯签到题,输入三个数字按照要求进行计算,最后输出的时候直接强转int即可

代码:

package _传智杯.初赛._4;

import java.util.Scanner;

public class A_组原成绩 {
    public static void main(String args[]){
        Scanner sc=new Scanner(System.in);
        int t=sc.nextInt();
        int h=sc.nextInt();
        int e=sc.nextInt();
        int res=(int)(t*0.2+h*0.3+e*0.5);
        System.out.println(res);
    }
}

 B报告赋分

B-报告赋分

题目描述

花栗鼠科技大学的计算机组成原理实验最终的结课考核方式是提交一份报告。

然而作为任课老师,萝老师不希望大家过于内卷,所以指定了如下规定:

每份报告有一个卷面基础分 a。

在此基础上:

  • 若是报告字数低于16页,则扣10分,如果分数低于0分了,则记作 0 分。

  • 若是报告字数超过20页,每超过1页扣1分 ,直到分数扣到0分为止。

现在你知道了一份报告的卷面基础分 a 和它的页数 p ,请你计算这份报告的最终得分。我们保证 1≤a≤100,1≤p≤50.

输入格式

本题有多组数据。

第一行一个整数T(1≤T≤1000) ,表示数据组数。

接下来T行,每行两个整数 a,p意义如题所示。

输出格式

共 T 行,每行一个整数,表示该次询问的数据最终的得分

输入输出样例

输入

2
70 17
80 10

输出

70
70

 代码:

package _传智杯.初赛._4;

import java.util.Scanner;

public class B_报告赋分 {
    public static int f(int x,int y){
        if(y<16) x-=10;
        if(y>20) x=x-(y-20);
        if(x<0)  x=0;
        return x;
    }
    public static void main(String args[]){
        Scanner sc=new Scanner(System.in);
        int t=sc.nextInt();
        int res[]=new int[t+1];
        for(int i=1;i<=t;i++){
            int x=sc.nextInt();
            int y=sc.nextInt();
            res[i]=f(x,y);
        }
        for(int i=1;i<=t;i++){
            System.out.println(res[i]);
        }
    }
}

C竞争得分

C-竞争得分

题目描述

为了鼓励大家写出更好的作业,花栗鼠科技大学(Hualishu University of Science and Technology, HUST)的组原实验采用了竞争得分的方式。

具体来说,假设有n个人提交了作业,并且其中原始得分最低的人记作 a_{min},原始得分最高的人记作 a_{max}​,第i个人的原始得分为 a_i,那么第 i 个人的得分就是:

100 \times \frac{a_i-a_{min}}{a_{max}-a_{min}}

由于成绩系统的问题,最终录入的成绩只能是整数,采用直接去掉小数部分的方法

输入格式

第一行一个整数n表示人数(1≤n≤1000)

第二行共n个整数,为序列 a ,其中 ai表示第i个人的原始作业得分(1≤ai​≤1000)

输出格式

一行,共 n个整数,表示经过更新后每个人的得分。

输入输出样例

输入

3
1 2 3

输出

0 50 100

 代码:

package _传智杯.初赛._4;

import java.util.Scanner;

public class C_竞争得分 {
    public static void main(String args[]){
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        int a[]=new int[n+1];
        int b[]=new int[n+1];
        int max=Integer.MIN_VALUE;
        int min=Integer.MAX_VALUE;
        for(int i=1;i<=n;i++){
            a[i]=sc.nextInt();
            if(max<a[i]) max=a[i];
            if(min>a[i]) min=a[i];
        }
        for(int i=1;i<=n;i++){
            b[i]= (int) (100*((a[i]-min)*1.0/(max-min)*1.0));
        }
        for(int i=1;i<=n;i++){
            if(i!=n)
                System.out.print(b[i]+" ");
            else
                System.out.print(b[i]);
        }
    }
}

D小卡与质数2

D-小卡与质数2

题目描述

小卡最近迷上了质数,所以他想把任何一个数都转化为质数!

小卡有 T次询问,每次给你一个数字 x,问有多少个比 x小的非负整数 y,使得 x⊕y 是质数,其中⊕ 表示按位异或。

输入格式

第一行一个正整数 T(1≤T≤^{10^{5}}),表示有 T组询问。

接下来 T 行,每行一个正整数 x(1≤x≤_{10^{6}})。

输出格式

对于每组询问,输出一行一个整数,表示答案。

输入

9
5
6
7
8
9
10
100
1000
10000

输出

2
4
4
2
2
4
22
163
1132

前语:

自己一开始直接暴力,然后TLE了,后来看视频说有规律,是看输入的数字转化为二进制后,从右往左标号1-n编号,看哪一位为1,则就加上该位数的质数个数(不看首位),例如6的二进制为110,则第二位和第三位为1,就加上两位质数和三位质数的个数,两位的质数有2(10)、3(11)三位的质数有5(101)、7(111)即2+2=4,各位读者请自行理解.

所以一开始将所有质数转化为二进制,按照位数存储在a[]数组中,然后遍历自己输入数字的二进制,看哪一位为1然后累加得出最后结果.

代码: 

package _传智杯.初赛._4;

import java.io.*;

public class D_小卡与质数2 {
    public static boolean isprime(int n){
        if(n==1) return false;
        for(int i=2;i<= Math.sqrt(n);i++){
            if(n%i==0) return false;
        }
        return true;
    }
    public static void main(String args[]) throws IOException {
        StreamTokenizer st=new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
        int a[]=new int[22];
        for(int i=1;i<=1100000;i++){
            if(isprime(i)){
                String s1=Integer.toBinaryString(i);
                a[s1.length()]++;
            }
        }
        st.nextToken();
        int t=(int)st.nval;
        for(int i=1;i<=t;i++){
            int cnt=0;
            st.nextToken();
            int x=(int)st.nval;
            String s2=Integer.toBinaryString(x);
            for(int j=0;j<s2.length()-1;j++){
                if(s2.charAt(j)=='1'){
                    cnt+=a[s2.length()-j];
                }
            }
            System.out.println(cnt);
        }
    }
}

E萝卜数据库

E-萝卜数据库

题目描述

花栗鼠很喜欢偷吃生产队的大萝卜,因此花栗鼠科技大学正在研究一种新型的数据库,叫做萝卜数据库。

具体来说,它支持k(1≤k≤100) 个字段,每个字段名都是整数,里面存储的数值也都是整数。

现在你支持如下操作:

  • 向数据库中插入一个记录,它可能只会包含 k个字段的某一部分。具体的操作格式详见“输入格式”。

  • 在数据库中查询有多少条符合条件的记录。

现在你总共有 n次操作(1≤n≤1000),请你对每个回答操作,输出结果。

输入格式

第一行两个整数 n,k,意义如题所述。

接下来的若干行,每行代表一次操作,具体如下:

  • 1\ p\ x_1\ \ y_1,...,x_p\ y_p​ :表示一个插入操作,其中共有 p 个字段,第 i字段的名字是 x_i​ ,值为 y_i.此处我们保证 1≤xi​≤k,1≤yi​≤1000,并且 x_i,y_i均为整数。

  • 2\ x\ y_{min}\ y_{max}:表示一次查询操作,表示查询所有满足 字段 xx 的值在 [y_{min},y_{max}] 之间的记录有多少个。

输出格式

对于每个查询操作,输出一行一个整数,表示符合条件的记录个数。

代码:

package _传智杯.初赛._4;

import java.util.Arrays;
import java.util.Scanner;

public class E_萝卜数据库 {
    public static void main(String args[]){
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        int k=sc.nextInt();
        String s1[]=new String[k+1];
        Arrays.fill(s1,"");
        for(int i=1;i<=n;i++){
            int x1=sc.nextInt();
            if(x1==1){
                int x2=sc.nextInt();
                for(int j=1;j<=x2;j++){
                    int a=sc.nextInt();
                    int b=sc.nextInt();
                    s1[a]+=(b+" ");
                }
            }
            else{
                int x3=sc.nextInt();
                int min=sc.nextInt();
                int max=sc.nextInt();
                int cnt=0;
                if(s1[x3]!=""){
                    String s2[]=s1[x3].split(" ");
                    for(int j=0;j<s2.length;j++){
                        int temp=Integer.parseInt(s2[j]);
                        if(temp>=min&&temp<=max){
                            cnt++;
                        }
                    }
                    System.out.println(cnt);
                }
            }
        }
    }
}

 大家有问题可以私聊或评论,看见后会第一时间回复!!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值