计挑赛初赛试题(2021)(Java组)

以下题目仅为个人思路,如果有错的地方还请指出。

16.从大于等于N的正整数里找到一个最小的数M,使之满足:M和M的逆序数(如1230的逆序数为321)的乘积为一个[100000000,200000000]区间内的值。
输入说明:起始数字N;
输出说明:找到的第一个符合条件的数,如果没有符合条件的数,输出F。
输入样例:123456
输出样例:124100

解题思路:我觉得唯一要考虑的就是什么时候输出F,我当时的想法是如果两个数是6位数相乘一定超出区间了,所以判断条件设为了大于200000,感觉不怎么对

import java.util.*;

public class Main{
    public static void main(String[] args){
    	Scanner sc=new Scanner(System.in);
    	long m=sc.nextInt();
    	while(true) {
    		long n=++m;
    		//把它变成字符串
    		String s=n+"";
    		String[] s1=s.split("");
    		long w=0;
    		int index=0;
    		//变成逆序
    		for (int i = s1.length-1,j=1; i >=0; i--,j*=10) {
    			w+=Integer.parseInt(s1[index])*j;
    			index++;
    		}
    		if (m*w>=100000000&&m*w<=200000000) {
				System.out.println(m);
				break;
			}
    		//我这里想的是,如果是两个6位数相乘结果一定超出所给区间了
    		if (m>200000) {
				System.out.println("F");
				break;
			}
    	}
    }
}

17.某地大数据防疫平台记录了往来的所有防疫相关信息,包括 本地或外地人员、健康码颜色、接种疫苗情况、最近一次核酸结果、最近一次核酸检测时间等。
为此,该地某区域如果检测到满足如下条件的人员进入,将触发对应报警:
黄色报警:黄码人员 或 3天(天数<3)内未检测核酸且未完全接种疫苗的外地人员;
红色报警:红码人员 或 最后一次核酸检测为阳性的人员。
请设计程序,判断检测如下人员会出发多少次黄色和红色报警。
输入说明:

第一行,人员数量;
第二行开始每行为该人员的各个参数,以空格隔开,包括:
本地或外地人员:本地为’L’,外地为'T’;
健康码颜色:绿色为’G’,黄色为’Y’,红色为’R’
接种疫苗情况:完全接种为‘C’,其他为’E’;
最近一次核酸检测结果:阴性为’N’,阳性为’P’, 未查为’U '
最近一次核酸检测时间为:整数,取值范围为0-7,0代表当天检测,7代表7天或更长时间之前检测或未查;
输出说明:一行,符合黄色报警和红色报警的人数,中间以空格隔开。(已记录为红色报警的人员不再重复记录为黄色报警,即如果同时触发黄色报警和红色报警只记录为红色报警)
输入样例:4
L G C U 7
L Y C N 3
T G E N 1
T G C P 1(最后一行不知道是不是)

输出结果为:1 1

解题思路:首先它的行数不确定,但是列数固定5列,所以我开了一个二维数组接收。

循环判断:首先判断红色警报,因为如果它是红色警报就不用判断是否为黄色警报了

该行下标为1的字母为R

或者该行下标为3的字母为P,

然后判断黄色警报:该行下标为1的字母为Y

或者它满足下面四个条件

1 该行下标为0的字母为T

2 该行下标为2的字母为E

3 该行下标为3的字母为U

4 3天内未检测核酸

import java.util.*;

public class Main1 {

	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		int n=sc.nextInt();
		String[][] s=new String[n][5];
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < 5; j++) {
				s[i][j]=sc.next();
			}
		}
		int a=0,b=0;
		for (int i = 0; i < n; i++) {
			if (s[i][1].equals("R")) {
				b++;
				//防止触发红色和黄色两个警报
				continue;
			}else {
				if (s[i][3].equals("P")) {
					b++;
					//防止触发红色和黄色两个警报
					continue;
				}
			}
			if (s[i][1].equals("Y")) {
				a++;
			}else {
				if (s[i][2].equals("E")&&s[i][0].equals("T")&&s[i][3].equals("U")) {
					char c=s[i][4].charAt(0);
					int d=c-48;
					if (d<3) {
						a++;
					}
				}
			}
		}
		System.out.println(a+" "+b);
	}
}

18.二维空间中给定一组点的坐标,以任意两个点为直径绘制一个圆。
求可以绘制的最小圆,该圆至少包含2个其他点,输出其直径。
说明,圆心O,半径r的圆包含某点P的条件是,r≥(O到P的距离)。
输入说明:第一行,点的数量,不超过200;
第二行开始为点二维坐标,每个点为一行,每个点的两个维度间以空格隔开,坐标值范围为
[-10000.0,10000.0]。
输出说明:输出满足条件的圆的直径(保留小数点后3位有效数字,四舍五入)
输入样例:6
0 0
1 0.5
2 0
3 0
1 0
2 1
输出样例:2.000

解题思路:

这一组数是一个点,首先获取以这组数组成的圆的直径,后面进行比较判断是否有更小的

得到组成圆的最大值和最小值,然后循环判断是否有其他两组点在圆内。

判断条件:得到该组数的最大值1和最小值1,和组成圆的最大值和最小值进行对比,如果最小值1大于最小值并且最大值1大于最大值说明在圆内

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        double[][] a = new double[n][2];
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < 2; j++) {
                a[i][j] = sc.nextDouble();
            }
        }
        double max=Integer.MAX_VALUE;
        double len=0;
        for (int i = 0; i < n; i++) {
            double big=Math.max(a[i][0],a[i][1]);
            double small=Math.min(a[i][0],a[i][1]);
            //得到当前圆的直径,如果是两个数同号则直径为大值-小值,不同则两数相加
            if(a[i][0]<0&&a[i][1]<0||a[i][0]>0&&a[i][1]>0){
                len=big-small;
            }else {
                len=Math.abs(a[i][0])+Math.abs(a[i][1]);
            }
            int count=0;
            for (int j = 0; j < n; j++) {
                double big1=Math.max(a[j][0],a[j][1]);
                double small1=Math.min(a[j][0],a[j][1]);
                if (small1>=small&&big1<=big) {
                    count++;
                }
                //因为会判断自身所以要>3
                if (count>3) {
                    if (len<max) {
                        max=len;
                        break;
                    }else {
                        break;
                    }
                }
            }
        }
        System.out.printf("%.3f",max);
    }
}

19.某游戏公司设计了一个奖励活动,给N个用户(1≤N≤10^7)连续编号为1到N,依据用户的编号S发放奖励。


首先给每个用户发放1张4星卡片。
然后公司设定三个非零正整数x,y, z,
如果S同时是x、y的倍数,额外奖励9张2星卡片;
如果S同时是y、z的倍数,额外奖励3张3星卡片;
如果S同时是x、z的倍数,额外奖励1张4星卡片;
多个奖励可以累计获取。


求任意连续的L个用户,使得这L个用户得到的2星卡数量和 和 这L个用户得到的3星卡、4星卡数量总和的差值绝对值最大,输出该最大的差值绝对值。


输入说明:第一行,输入N,L,以空格隔开;(1≤L≤N≤10^7)
第二行,输入x,y,z,以空格隔开;(1<x,y,z≤L)
输出说明:符合条件的差值绝对值。
输入样例: 40 7
3 5 2
输出样例:12

解题思路:这个和上一年那个卖鸡蛋的有点像都是要分组解决问题

计挑赛初赛试题(2020)(一)_m0_55997161的博客-CSDN博客

注意初始化的时候4星卡的数量是L个因为有L个人,每个都有一张.

import java.util.Scanner;
public class Main {

    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        int l=sc.nextInt();
        int x=sc.nextInt();
        int y=sc.nextInt();
        int z=sc.nextInt();
        int [] arr=new int[n];
        for (int i=0; i<n; i++) 
            arr[i]=i+1;
        int min=Integer.MIN_VALUE;
        for (int i=0; i<n-l;i++){
            int two=0,three=0,four=l;
            for (int j=0; j<l;j++){
                if (arr[i+j]%x==0&&arr[i+j]%y==0) two+=9;
                if (arr[i+j]%y==0&&arr[i+j]%z==0) three+=3;
                if (arr[i+j]%x==0&&arr[i+j]%z==0) four+=1;
            }
            int ans=Math.abs(two-(three+four));
            if (ans>min) min=ans;
        }
        System.out.println(min);
    }
}

  • 5
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

1while(true){learn}

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值