传智杯
快来分享你的内容吧~
竞赛——【传智杯】2021年第四届“传智杯”全国大学生IT技能大赛(初赛Java)题解
题目洛谷链接(自测ac):[https://www.luogu.com.cn/contest/58542#problems](https://www.luogu.com.cn/contest/58542#problems) ### 1、组原成绩 **题目描述:**  **测试用例** > 输入:50 100 100 > 输出:90 **题解代码:** `//简单计算+转型 import java.util.Scanner; public class Test1 { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int t = scanner.nextInt(); int h = scanner.nextInt(); int e = scanner.nextInt(); int w =(int)( t * 0.2 + h * 0.3 + e * 0.5); System.out.println(w); } }` ### 2、报告赋分 **题目描述:**  **测试用例** > 输入: > 2 > 70 17 > 80 10 > 输出: > 70 > 70 **题解代码:** `import java.util.Scanner; public class Test2 { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int T = scanner.nextInt(); //行数 int[][] arr = new int[T][2]; //创建一个存储T行数据的数组 for (int i = 0; i < T; i++) { //遍历输入数据存入数组 int a = scanner.nextInt(); int p = scanner.nextInt(); arr[i][0] = a; arr[i][1] = p; } //计算得分 int count = 0; for (int i = 0; i < T; i++) { //分为大于20,小于16,在[16,20]三种情况计算得分 if(arr[i][1] < 16){ count = arr[i][0] - 10; }else if (arr[i][1] > 20){ count = arr[i][0] - (arr[i][1] - 20); }else{ count = arr[i][0]; } //判断得分如果被扣小于0,最低为0分 if (count < 0){ count = 0; } System.out.println(count); } } }` ### 3、竞争得分 **题目描述:**  **测试用例**: > 输入: > 3 > 1 2 3 > 输出: > 0 50 100 **题解代码:** `import java.util.Scanner; public class Test3 { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); int[] arr = new int[n];//数组用于保存输入数据(原始分) //求最大最小(因为只需得到最大最小,为降低时间复杂度,不冒泡对全部排序) int min = 1001; int max = -1; for (int i = 0; i < n; i++) { arr[i] = scanner.nextInt(); if(arr[i] > max) max = arr[i]; if(arr[i] < min) min = arr[i]; } //根据公式计算 int count; for (int i = 0; i < n; i++) { count = (100* (arr[i] - min))/(max - min); System.out.print(count + " "); } } }` ### 4、小卡和质数2 **题目:**  **测试用例:** > 输入: > 9 > 5 > 6 > 7 > 8 > 9 > 10 > 100 > 1000 > 10000 > 输出: > 2 > 4 > 4 > 2 > 2 > 4 > 22 > 163 > 1132 **题解代码:** `//质数(又称素数),指在大于1的自然数中除了1和该数自身外,无法被其他自然数整除的数 //java中 ^ 表示异或运算符,两数异或运算得到一个新的数 import java.util.Scanner; public class Test4 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); long startTime = System.currentTimeMillis(); //获取开始时间 int arr; int[] tol = new int[n]; int count = 0; for (int i = 0; i < n; i++) { arr = sc.nextInt(); for (int j = 0; j < arr; j++) { if (isPrime(arr ^ j) == 1) { count++; } } tol[i] = count; count = 0; } for (int k = 0; k < n; k++) { System.out.println(tol[k]); } } //判断是否为质数的函数(质数:除了1和本身不能被其他整数整除) public static int isPrime(int n){ int i=2; for(;i< n ;i++){ if(n%i==0){ return 0; } } if(n==i){ return 1; } return 0; } }` ### 5、萝卜数据库 **题目:**  **测试样例:** > 输入 > 4 5 > 1 2 1 2 2 4 > 2 2 1 5 > 1 2 3 5 4 6 > 2 4 7 8 > > 输出: > 1 > 0 **题解代码:** `//双数组 + 循环 import java.util.Scanner; public class Test5 { static Scanner scanner = new Scanner(System.in); public static void main(String[] args) { int n = scanner.nextInt(); //共有n次操作 int k = scanner.nextInt(); //支持k个字段 int[] arr = new int[k + 1]; //存储数值的数组,字段名从1开始,而数组下标从0开始,故容量为K+1 int[] arr1 = new int[n]; //存记录满足查询条件的值的个数的数组,用于统一输出 int number = n; //记录操作次数, int number1 = 0; //用作数组arr1[]的索引 while (number > 0) { int num = scanner.nextInt(); //选择插入或查询操作(1或2) //插入操作 if (num == 1) { int p = scanner.nextInt(); //插入多少个字段 for (int i = 0; i < p; i++) { int x = scanner.nextInt(); //字段名 int y = scanner.nextInt(); //字段值 arr[x] = y; //字段名x值为y } //查询操作 } else if (num == 2) { int count = 0; //统计满足查询条件的个数 int temp = scanner.nextInt(); //要查询的值 int temp1 = scanner.nextInt(); //查询字段名起点min int temp2 = scanner.nextInt(); //查询字段名终点max for (int i = temp1; i <= temp2; i++) { //从[min,max]中查找 if(i < k){ if (arr[i] == temp) { count++; } } } arr1[number1] = count; //存储每次满足查询条件的值的个数 number1++; } number--; //操作次数 } for (int i = 0; i < number1; i++) { //输出查询结果 System.out.println(arr1[i]); } } }`
竞赛——【传智杯】2020年第三届“传智杯”全国大学生IT技能大赛(初赛Java)题解
题目洛谷链接: `https://www.luogu.com.cn/contest/38442#problems` ### 1、课程报名 **题目描述:** 传智播客推出了一款课程,并进行了一次促销活动。具体来说就是,课程的初始定价为 _v_ 元;每报名 m 个学员,课程的定价就要提升 a 元。由于课程能够容纳的学生有限,因此报名到 n 人的时候就停止报名。 **输入格式** 一行四个使用空格隔开的整数,分别为 n,v,m,a **输出格式** 一行一个整数,表示答案。 **测试用例** > > > `输入:5 1 1 1 输出:15` **样例解释** 每卖出 1个课程,价格就会提高 1 元,所以总共获得 1+2+3+4+5=15 元。 **题解代码:** `import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); int v = scanner.nextInt(); int m = scanner.nextInt(); int a = scanner.nextInt(); int count = 0; int num = 0; for (int i = 0; i < n; i++) { if(num == m){ v += a; num = 0; } num++; count += v; } System.out.println(count); } }` ### 2、期末考试成绩 **题目描述**  **输入格式** 一行一个整数 x,表示该人的期末得分。 **输出格式** 一个小数点后只有一位的浮点数,表示该同学获得的GPA。 请注意,如果有 .0 请保留。 **样例:** > **样例输入** 1 > 99 > **样例输出** 1 > 4.0 > **样例输入** 2 > 88 > **样例输出** 2 > 3.8 > **样例输入** 3 > 12 > **样例输出** 3 > 0.0  **题解代码:** `import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int num = scanner.nextInt(); double gpa = 0; if(num >= 90){ gpa = 4.0; }else if(num < 90 && num >= 60){ gpa = 4.0 - ((90 - num) * 0.1); }else{ int num1 = (int)Math.floor(Math.sqrt(num) * 10); if(num1 < 60){ gpa = 0; } else { gpa = 4.0 - ((90 - num1) * 0.1); } } System.out.println(String.format("%.1f",gpa)); //字符串常规类型格式化 %f:浮点类型 } }` ### 3、志愿者 **题目描述:**   **测试样例**: > 输入: > 3 > 1 2 > 2 3 > 3 4 > 输出: > 3 2 1 
竞赛——【传智杯】2019年第二届“传智杯”全国大学生IT技能大赛(初赛Java)
**本次题目共四道** 题单洛谷: `https://www.luogu.com.cn/training/247892#problems` 1、软件工程实习 ======== 题目描述 ---- 某大学的《软件工程》必修课分为理论和实践部分。理论部分由该校教授完成授课;而实践部分是由第三方的公司主导,需要同学们在五周时间内自学 HTML、css、JavaScript、vue、Python、django 等技术,并组队完成一个真实的互联网商业应用。 参与这个课程的有 $n(0\\le n \\le 1000)$ 个学生,分成了不超过 $26$ 个队伍,每个队伍用 `A` 到 `Z` 来表示。每个队伍都会完成一个项目,并以队伍为单位,给所有队伍(包括自己队伍)打分,范围是 $0$ 到 $100$ 的整数。 为了平息学生对这门课产生的出多问题的不满(比如工作量太大、时间过于紧张、考核方式不公平等),老师决定使用一种“看起来”很公平的方式来决定每组队伍的项目得分: 对于某个队伍,首先计算所有队伍(包括自己)给这个队伍评分的平均值,然后剔除掉和这个平均值差别超过 $15$ 分的评分(保证不会出现所有的评分全部被剔除的情况),最后再对剩余的评分求平均值,四舍五入取整后作为这个队伍的项目得分。 对于每一个同学,我们已经得知他们的队伍代号和理论成绩(也是 $0$ 到 $100$ 分的整数)。这位同学的最后得分就是 $60%$ 的理论成绩加上 $40%$ 的所在队伍的项目得分,然后四舍五入取整。 现在老师想知道所有同学的分数排行。请按最后得分从高到低的顺序,输出每位同学的得分和他所在的队伍。 输入格式 ---- 第一行两个整数 $n$ 和 $k$,分别表示学生数和队伍数。 接下来 $n$ 行,每行一个整数 $s\_i$ 和一个大写字母 $c\_i$,表示第 $i$ 个选手的理论分数和队伍编号。保证队伍编号范围是从 `A` 开始后连续 $k$ 个字母中的一个。 接下来 $k$ 行,每行 $k$ 个整数。其中第 $i$ 行第 $j$ 列的整数 $a\_{i,j}$ 表示第 $i$ 个队伍给第 $j$ 个队伍的评分,当 $i=j$ 时,就是自评。 输出格式 ---- 输出 $n$ 行表示答案,得分高的同学优先输出,得分相同时队伍编号较小的同学优先输出。对于每一行,先输出这位同学成绩,然后输出代表他的队伍编号的大写英文字母。 样例 #1 ----- ### 样例输入 #1 `6 3 70 A 80 A 65 B 95 B 85 C 90 C 70 90 100 95 88 85 30 47 100` ### 样例输出 #1 `93 B 92 C 89 C 76 A 75 B 70 A` 提示 -- A 组收到的分数分别是 $70,95,30$,其平均分为 $65$,则 $95,30$ 被作为无效成绩剔除,因此 A 组的项目得分是 $70$ 分。 B 组收到的分数分别是 $90,88,47$,其平均分为 $75$,则 $47$ 被作为无效成绩剔除,因此 B 组的项目得分是 $89$ 分。 C 组收到的分数分别是 $100,85,100$,其平均分为 $95$,没有打分被剔除,因此 C 组的项目得分是 $95$ 分。 2、1024 程序员节发橙子 ============== 题目描述 ---- 每年的 1024 程序员节日,黑马程序员都会举办大型的庆祝活动。今年的程序员节也不例外,每个班级的同学都发了橙子。 班级里有 $n$ 名同学从前到后排成一排,且已经得知了这些同学的成绩,其中第 $i$ 名同学的成绩是 $a\_i$。班主任想根据同学们上个阶段的考试成绩来评定发橙子的数量。为了激励成绩优秀同学,发橙子时需要满足如下要求: * 相邻同学中成绩好的同学的橙子必须更多。若相邻的同学成绩一样,则它们分到的数量必须平等。 * 每个同学至少分配一个橙子 由于预算有限,班主任希望在符合要求的情况下发出尽可能少的橙子。请问,至少需要准备多少橙子呢? 输入格式 ---- 第一行是一个整数 $n$,表示学生数量。 接下来一行有 $n$ 个整数,第 $i$ 个整数 $a\_i$,表示第 $i$ 个同学的成绩。 输出格式 ---- 输出答案,也就是需要最少准备多少个橙子。 样例 #1 ----- ### 样例输入 #1 `5 3 4 5 4 3` ### 样例输出 #1 `9` 提示 -- #### 样例 1 解释 每位同学拿到的橙子的数量分别是 $1,2,3,2,1$,所以至少需要准备 $9$ 个。 #### 数据规模与约定 对于全部的测试点,保证 $1 \\leq n \\leq 10^6$,$0 \\leq a\_i \\leq 10^9$。 3、众数出现的次数 ========= 题目描述 ---- 传智专修学员的课堂上,为了活跃气氛,并巩固位运算的知识,同学们玩起了一个游戏。 班级里有 $n(n\\le10^6)$ 名同学,每位同学都获得了两张卡,红卡或者黑卡。每张卡上都有一个不超过 $10^9$ 的非负整数。第 $i$ 位同学手里红卡数字是 $a\_i$ ,黑卡数字是 $b\_i$。 现在需要每位同学出牌。每位同学可以直接将红卡上的数字打出,或者将自己的红卡上的数字和自己黑卡数字进行按位异或操作后的结果打出。最后老师会收集所有同学打出的数字。 这些数字中出现次数最多的数字是众数。在所有同学合作的最优策略下,我们希望众数对应数字出现的次数尽可能多。请问出现次数最多的数字是多少呢? 输入格式 ---- 第一行,一个正整数 $n$。 接下来 $n$ 行,其中第 $i$ 行时非负整数 $a\_i,b\_i$ 代表第 $i$ 名同学手上红卡和黑卡的数字。 输出格式 ---- 一个整数,表示答案。如果有多个解,请输出最小的那个。 样例 #1 ----- ### 样例输入 #1 `4 21 9 28 9 28 3 17 4` ### 样例输出 #1 `21` 提示 -- 样例解释: 众数出现次数最多是 $3$ 次,有如下两种方法: * $1$ 号同学直接出红卡,$2$ 号同学出红黑异或,$3$ 号同学随便出,$4$ 号同学出红黑异或。这样 $1,2,4$ 号同学都可以打出 $21$。 * $1$ 号同学出红黑异或,$2$ 号同学直接出红卡,$3$ 号同学直接出红卡,$4$ 号同学随便出。这样 $1,2,3$ 号同学都可以打出 $28$。 所以 $21$ 和 $28$ 都是出现次数最多的众数,因为最多可以出现 $3$ 次,不存在出现 $4$ 次的方案。但是由于要求如果有多解输出小的,请输出 $21$。 4、特殊的翻转 ======= 题目描述 ---- k 老师在研究一段病毒程序的代码。这段代码是由一段长度不超过 $10^6$ 的十六进制字符(也就是 `0` 到 `9` 和 `A` 到 `F`)组成的信息。现在 k 老师要将其转换为二进制的 0/1 串(这个时候需要确保最高位是 1)。然后对这个 0/1 串进行“翻转”操作。 对于每次“翻转”操作,k 老师可以选择这个 0/1 串中的其中一位,将这一位和这一位相邻的两位,一共三位,分别进行“翻转”(也就是 0 变 1,1 变 0)。如果指定的这一位是序列的开头或者结尾,那么翻转这一位和存在的相邻位即可。 k 老师想知道,如何用最少的“翻转”步骤,将这个 0/1 串变为全 0 的串。 输入格式 ---- 一个十六进制的字符串,由 `0` 到 `9` 和 `A` 到 `F` 构成。 输出格式 ---- 最少能将其变为全 0 串需要的“翻转”步骤次数。如果无论如何都不能将其变为全 0 串,则输出 `No`。 样例 #1 ----- ### 样例输入 #1 `15` ### 样例输出 #1 `3` 样例 #2 ----- ### 样例输入 #2 `FF` ### 样例输出 #2 `3` 样例 #3 ----- ### 样例输入 #3 `10` ### 样例输出 #3 `No` 提示 -- 样例解释: 十六进制的 15 对应二进制的 10101,翻转第 1/3/5 位,就可以全部变为 0。 十六进制的 FF 对应二进制的 11111111,翻转第 2/5/8 位,就可以全部变为 0。 十六进制的 10 对应二进制的 10000,无法全变为 0。
