2022蓝桥杯javaC省赛

目录

A:排列字母

代码:

B、特殊时间

 C、纸张尺寸

个人代码:

D、求和

个人代码:

E、矩形拼接

个人代码:

F、选数异或

个人代码:

G:GCD

个人代码:

H:青蛙过河

个人代码:

I:因数平方和

个人代码:

J:最长不下降子序列


A:排列字母

签到题来了!!!

2022蓝桥杯javaC省赛_第1张图片

直接上代码(也可以手推哈)

个人答案:AAAEEEEEEHHHIIILLRRRSSTTWWWY

代码:

import java.util.Arrays;

public class 字母排列 {
    public static void main(String[] args) {
        String ss="WHERETHEREISAWILLTHEREISAWAY";
        char []arr=new char[ss.length()];
        for (int i=0;i

B、特殊时间

比赛时没写!!!

2022蓝桥杯javaC省赛_第2张图片

 个人答案:220

2022蓝桥杯javaC省赛_第3张图片

 C、纸张尺寸

大题的签到题了!

2022蓝桥杯javaC省赛_第4张图片

 思路:开一个长度为10的数组,直接存放每一个对应的长宽就好

个人代码:

import java.util.Scanner;

public class 纸张尺寸 {
    public static void main(String[] args) {
        int [][]arr=new int[10][2];
        Scanner sc=new Scanner(System.in);
        int a=1189,b=841;
        arr[0][0]=1189;
        arr[0][1]=841;
        for (int i=1;i<10;i++){
            arr[i][0]=Math.min(a,b);
            if (a>b) {
                a /= 2;
            }
            else{
                b/=2;
            }
            arr[i][1]=Math.min(a,b);
        }
        String ss=sc.next();
        int t=ss.charAt(1)-'0';
        System.out.println(arr[t][0]);
        System.out.println(arr[t][1]);
    }
}

D、求和

2022蓝桥杯javaC省赛_第5张图片

 我比赛的时候用的是前缀和的方法计算的,每一次取出最前的面的数,和后面的所有数和相乘;

个人代码:

import java.util.Scanner;

public class 求和 {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        long s=0;
        int n=sc.nextInt();
        int []arr=new int[n];
        for (int i=0;i

2022蓝桥杯javaC省赛_第6张图片

 测了一下20万个1000,没爆,也就是说200000个1000的结果也是可以出来的,所以直接用的long型,用大数应该也问题不大

E、矩形拼接

2022蓝桥杯javaC省赛_第7张图片

 这题思路:三个图案组成后,只会有三种情况

4条边;6条边;8条边;

比赛和回来写的不太一样,回来后写只有九十几行代码,比赛直接十多个if用的一百多行代码!!!

个人代码:

import java.util.Scanner;

public class 矩形拼接 {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int T=sc.nextInt();
        int xa,xb,xc,ya,yb,yc;
        for (int i=0;i

F、选数异或

2022蓝桥杯javaC省赛_第8张图片

 不会异或,比赛瞎写了一个,然后纯纯就是暴力,不知道对不对(数据不大,如果对的话应该有40%的感觉)!

个人代码:

import java.util.Scanner;

public class 选数异或 {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        int m=sc.nextInt();
        int x=sc.nextInt();
        int []arr=new int[n+1];
        for (int i=1;i<=n;i++){
            arr[i]=sc.nextInt();
        }
        for (int i=0;i

G:GCD

2022蓝桥杯javaC省赛_第9张图片

 用我的话说:这就是一个骗人的题!!!

问gcd(a+k,b+k)的最大公约数,不难想到最大公约数为abs(a-b)

举例:a=10,b=17

这俩数同时增加k可以获得最大公约数为7;

10+4,17+4;即14和21的最大公约数,满足7;并且无论怎么凑都无法获得大于7的公约数

所以这题就很简单了,先判断可以获得的最大公约数,然后再寻找最小的k满足条件即可

个人代码:

import java.util.Scanner;

public class GCD {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        long a=sc.nextLong();
        long b=sc.nextLong();
        long max=Math.abs(a-b);
        if (a%max==0){
            System.out.print(0);
        }else {
            System.out.print(max-(a%max));
        }
    }
}

max-(a%max)是计算a加k个值可以满足公约数包含max;

H:青蛙过河

2022蓝桥杯javaC省赛_第10张图片

 这题不晓得思路对不对,比赛的时候用的双向的前缀和,然后来判断的,有兴趣看一下,我不晓得对不对。

测试用例:

5 1

1 0 1 0

从左往右前缀和:1  1   2   2

从右往左前缀和:0  1   1   2

然后寻找最小的位置,满足从左往右和从右往左都>=2*x;

跳跃宽度1:1/0  不满足

跳跃宽度2:1/1  不满足

跳跃宽度3:2/1  不满足

跳跃宽度4:2/2  满足

个人代码:

ps:不确定对错,看看就行

import java.util.Scanner;

public class 青蛙过河 {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        int x=sc.nextInt();
        int []arr=new int[n];
        int []brr=new int[n];
        int []crr=new int[n];
        for (int i=1;i=1;i--){
         crr[n-i]=crr[n-i-1]+arr[i];
        }
        for (int i=1;i=2*x&&crr[i]>=2*x){
                System.out.print(i);
                return;
            }
        }
    }
}

I:因数平方和

2022蓝桥杯javaC省赛_第11张图片

测试样例错了:100000      输出:680584257

这题比赛直接暴力了,1e8范围内的好像都可以出,但是1e9就不行,只能祈祷多点数据是1e8以内!!!

具体思路可以去做一下蓝桥杯练习系统试题集里面的约数个数那个题!!!

个人代码:

初始:

import java.util.Scanner;
public class 因数平方和 {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        long s=0;
        long k;
        for (int i=1;i<=n;i++){
            k=n/i;
            s+=(k*((long) i *i))%1000000007;
            s%=1000000007;
        }
        System.out.print(s);
    }
}

更改:

import java.math.BigInteger;
import java.util.Scanner;

public class 因数平方和 {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        long s=0;
        long k;
        int t= n/2;
        for (int i=1;i<=t;i++){
            k=n/i;
            s+=(k*((long) i *i))%1000000007;
            s%=1000000007;
        }
        BigInteger x= BigInteger.valueOf(n),y= BigInteger.valueOf(t);
        BigInteger a= BigInteger.valueOf(1),b= BigInteger.valueOf(2),c= BigInteger.valueOf(6);
        x= x.multiply(x.add(a)).multiply(x.multiply(b).add(a)).divide(c);
        y= y.multiply(y.add(a)).multiply(y.multiply(b).add(a)).divide(c);
        x=(x.add(BigInteger.valueOf(s)).subtract(y)).mod(BigInteger.valueOf(1000000007));
        System.out.print(x);
    }
}

J:最长不下降子序列

2022蓝桥杯javaC省赛_第12张图片

直接暴力骗分的,就不丢人了,溜了溜了!!! 

你可能感兴趣的:(java,蓝桥杯,算法)