本周ACM校队周赛考核题
1.简单数学(签到题)
题目:
Joker想要买三张牌,但是三张牌太少了,老板不卖,除非Joker算出老板给出的数学题。
现在老板给出t组数据,每一组数据有三个数a,b,c,要计算出每一组数据三个数相加是否是3的倍数,是的话就输出”Yes”,否则就输出”No”.
代码
import java.util.Scanner;public class Main{public static void main(String[] args) {// TODO Auto-generated method stubScanner scanner=new Scanner(System.in);int n=scanner.nextInt();int arr[][]=new int[n][3];for(int i=0;i<n;i++) {for(int j=0;j<3;j++) {arr[i][j]=scanner.nextInt();}}for(int i=0;i<n;i++) {long sum=0;for(int j=0;j<3;j++) {sum+=arr[i][j];}if(sum%3==0) {System.out.println("Yes");}else {System.out.println("No");}}}}
2.奇奇偶偶
题目:
Joker今天学完了数组,他发现在数组上面可以进行很多有意思的操作,现在他想对一个长度为n的数组a进行以下操作:
将两个元素 ai和 aj 互换,使得 i≠j、ai和 aj要么 都是偶数,要么 都是奇数。
他想知道是否可以通过执行任意次数(可能为零)的操作对数组进行非递减排序。
分析:由于偶数只能和偶数交换,奇数只能和奇数交换,因此只需要判断排序后的数组,跟原来的数组 相比,每个位置上的奇偶性是否改变,如果没有改变,证明可以通过任意次数的操作对数组进行非递减排序,
代码:
import java.util.*;
public class Main{public static void main(String[] args){Scanner sc = new Scanner(System.in);int t = sc.nextInt();while(t-->0){int n = sc.nextInt();int[] a = new int[n];int[] x = new int[n];for(int i = 0 ;i< n;i++){a[i] = sc.nextInt();x[i] = a[i];}Arrays.sort(a);boolean flag = false;for(int i = 0;i<n;i++){if(a[i] % 2 != x[i] % 2) flag = true;}if(flag) System.out.println("No");else System.out.println("Yes");}}
}
3.圆的艺术(数学问题)
给定一个圆和n条直线,现在需要使用这n条线尽可能地把圆分成多份,问使用n条线最多能把圆分成几份?
输入描述:
第一行给定一个正整数T,代表数据组数。(T<=1e5)。
接下来T行,每行一个非负整数,代表线的数量。(<=1e6)
输出描述:
共T行,每行一个整数,代表n条线最多能把圆分成几份。
示例:输入 2 2 4 输出: 4 11
如果想要把圆分成的块数最多,那么增加的每一条线都不能过前面所有的交点,分析如下
圆面本身是一个部分;
第一条直线只能穿过一个部分(圆面本身),画第一条直线时圆面加一个部分,圆面最多分成(1+1)=2(块);
第二条直线只能穿过两个部分,画第二条直线时圆面加两个部分,圆面最多分成(1+1+2)=4(块);
第三条直线只能穿过三个部分,画第三条直线时圆面加三个部分,圆面最多分(1+1+2+3)=7(块);
第四条直线能穿过四个部分,画第四条直线时圆面力四个部分,圆面最多分(1+1+2+3+4)=11(块);
依次类推可得,n条直线最多能将圆面分成[1+(1+2+3+4+…+n)](块)
也就是
因此,代码如下
import java.util.*;
public class Main{public static void main(String[] args){Scanner sc = new Scanner(System.in);int t = sc.nextInt();while(t-->0){long res = 0L;long n = sc.nextLong();System.out.println(n*(n-1) /2 + 1 + n);}}
}
4.又是时间问题
自从上一次,Joker解决完两个时间点的差值之后,他奋发图强努力学习,终于又遇到了一个问题,他家的时钟坏了,显示的时间不一定正确(即大小和顺序可能会出错),但是显示的时间(时钟,分钟,秒钟一定都是2位数的),所以他想请你帮他看看他家的时钟。现在给定t个字符串每个字符串都表示一个时间,现在要解决的问题是,判断每一个字符串表示的时间在经过换位后是否可以变成正确的时间,不可以的话就输出No,否则就计算出这个字符串所能表示的正确时间的最大时间的总秒数。(注:正确时间: (0 <= |时钟| <= 23, 0 <= |分钟| <= 59, 0 <= |秒钟| <= 59))
输入描述:
第一行输入一个正整数t表示组数;接下来t行每行一个字符串表示时间,
输出描述:
对于是正确的时间就输出,这个字符串所能表示的最大的正确时间的总秒数,否则就输出”No”;
例子:
输入;
3 12:20:60 20:23:40 00:20:30
输出
No 85220 73800
分析:考查的主要就是字符串转换为数字,最后判断一下
代码如下
import java.util.Arrays;
import java.util.Scanner;
public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int t = sc.nextInt();for (int i = 0; i < t; i++) {String s = sc.next();String[] split = s.split(":");Arrays.sort(split);int[] arr = new int[]{Integer.valueOf(split[0]), Integer.valueOf(split[1]), Integer.valueOf(split[2])};if (arr[0] >= 24 || arr[2] >= 60) {System.out.println("No");continue;}int cnt = 0;for (int j = split.length - 1; j >= 0; j--) {if (arr[j] <= 23) {cnt = j;break;}}if (cnt==0){System.out.println(arr[0]*3600+arr[2]*60+arr[1]);}else if (cnt==1){System.out.println(arr[1]*3600+arr[2]*60+arr[0]);}else{System.out.println(arr[2]*3600+arr[1]*60+arr[0]);}}}
}
总之,这周的题不是很难,主要是对基本功的考察,由此可见自己的基本功还是不是很扎实,需要好好练习
生活:
这周过的很忙,但是是那种虚无的忙,很讨厌这种感觉,其实,凡事,应该提前做好规划的,而不是总在等待deadline
向上的路总是难走的,因为它无时不刻磨练着一个人的意志力。
隔壁新乡学院的同学,再次联系到的时候,没想到已经考研上岸了,他说,这一路,真的很难走,从大一的挂四课被给家长打电话,到最后的考研上岸,整天整天的学,整夜整夜的熬,度过了疫情三年,度过了大洪水,每年只有春节的时候回家,那时候觉得根本看不到希望,也很迷茫,不知道路在哪里......。
总之,一路辛苦,以后,继续加油,追梦人。每个人都会去选择不同的路,但是,无论选择了哪条路,都应该静下心来去沉淀,去学习,遇到困难的时候,都应该告诉自己再往前一步,哪怕是自救还是借助他人的力量,而不是就此踌躇不前。
黎明之前最黑暗,谁先放弃谁笨蛋!
✨✨✨✨✨✨✨✨前面终有些光亮在等着你✨✨✨✨✨✨✨✨
下周就要继续写项目了,还有每天一两道算法题,还有对vue的知识点的理解和掌握。
偶,对了,收到了 全国大学生英语竞赛的省级二等奖证书了,是上学期的比赛了,开心开心,继续加油