第三次ACM校队周赛考核题+生活随笔

本周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 stub
        Scanner 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的知识点的理解和掌握。

偶,对了,收到了 全国大学生英语竞赛的省级二等奖证书了,是上学期的比赛了,开心开心,继续加油

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值