冲刺蓝桥31天,第十七天java题解

目录

一、距离和

解析:

代码:

二、扩散

解析:

代码:

三、错误票据

解析:

代码:

四、倍数问题

解析:

代码:


一、距离和

原题链接

 

解析:

这题的话直接搜索就可以了,按照顺序,每一个都和在它后面的数进行比较:

l----a;l---n;l----q;l---i;l----a;l-----o;

a---n;a---q;a----i;a----a;a----o;

具体代码如下:

代码:

public class 距离和 {
    public static void main(String[] args) {
        int []arr={'L','A','N','Q','I','A','O'};
        int count=0;
        for (int i=0;i<arr.length-1;i++){
            for (int j=i+1;j<arr.length;j++){
                count+=Math.abs(arr[i]-arr[j]);
            }
        }
        System.out.println(count);
    }
}

二、扩散

原题链接

 

解析:

这题就是一个简单的bfs题,当然存在着几个坑点:

坑点1:起始4个位置为黑色;

坑点2:可以存在负数坐标;

我们已知每分钟只会向边上扩散一格,那么2020分钟就是2020格,所以在做这题的时候,我们只要让每一个起始位置+2020就可以,当然为了防错,每一个值+3000,然后套用bfs模板即可

ps:运行超时,但是填空题我们只需要正确答案即可,答案:20312088;

代码:

import java.util.LinkedList;
import java.util.Queue;

public class 扩散 {
    static int [][]arr=new int[10000][10000];
    static int ax,ay,bx,by,cx,cy,dx,dy;
    static long count=4;
    public static void main(String[] args)throws Exception {
        init();
        bfs();
    }
    static void init() throws Exception{
        ax=3000;
        ay=3000;
        bx=5020;
        by=3011;
        cx=3011;
        cy=3014;
        dx=5000;
        dy=5000;
        arr[ax][ay]=1;
        arr[bx][by]=1;
        arr[cx][cy]=1;
        arr[dx][dy]=1;
    }
    static void bfs(){
        Queue<Integer>qx=new LinkedList<>();
        Queue<Integer>qy=new LinkedList<>();
        qx.add(ax);
        qx.add(bx);
        qx.add(cx);
        qx.add(dx);
        qy.add(ay);
        qy.add(by);
        qy.add(cy);
        qy.add(dy);
        int k=0;
        int t=4;
        int x,y,xa,ya,s=0;
        while (k<2020){
            while (t>0){
                x=qx.poll();
                y=qy.poll();
                t--;
                for (int i=-1;i<2;i++){
                    xa=x+i;
                    if (arr[xa][y]==0){
                        qx.add(xa);
                        qy.add(y);
                        arr[xa][y]=1;
                        count++;
                        s++;
                    }
                }
                for (int i=-1;i<2;i++){
                    ya=y+i;
                    if (arr[x][ya]==0){
                        qx.add(x);
                        qy.add(ya);
                        arr[x][ya]=1;
                        count++;
                        s++;
                    }
                }
            }
            k++;
            t=s;
            s=0;
        }
    }
}

三、错误票据

原题链接

 

解析:

这题呢就是查找一下连续数内部少了哪个数和重复了哪个数,将输入的数排序查询即可;

代码:

import java.util.Arrays;
import java.util.Scanner;

public class 错误票据 {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        sc.nextLine();
        String ss;
        int s=0;
        int []brr=new int[1000];
        for (int i=0;i<n;i++){
            ss=sc.nextLine();
            String[] arr =ss.split(" ");
            for (int j=0;j<arr.length;j++){
                brr[s]= Integer.parseInt(arr[j]);
                s++;
            }
        }
        Arrays.sort(brr);
        int a=0,b;
        for (int i=999;i>0;i--){
            if (brr[i]==0){
                System.out.print(a);
                return;
            }
            if (brr[i]-brr[i-1]>1&&brr[i-1]!=0){
                System.out.print(brr[i]-1+" ");
            }
            if (brr[i]==brr[i-1]){
                a=brr[i];
            }
        }
    }
}

四、倍数问题

原题链接

 

解析:

这题之前写过一次,在第五天的题解中,如果还不会可以去看一下。

代码:

import java.util.*;
// 1:无需package
// 2: 类名必须Main, 不可修改

public class Main {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        int k=sc.nextInt();
        int []arr=new int[n];
        int []brr=new int[3*k];
        int []crr=new int [k];
        for(int i=0;i<n;i++){
          arr[i]=sc.nextInt();
        }
        Arrays.sort(arr);
        int s=0;
        for(int i=n-1;i>=0;i--){
          if(crr[arr[i]%k]<2){
            crr[arr[i]%k]++;
            brr[s]=arr[i];
            s++;
            if(s==3*k)
            break;
          }
        }
        long  count=0;
        for(int i=0;i<s-2;i++){
          if(brr[i]*3<=count){
            System.out.println(count);
            return;
          }
          for(int j=i+1;j<s-1;j++){
            if(brr[i]+brr[j]*2<=count){
              break;
            }
            for(int m=j+1;m<s;m++){
              if(brr[i]+brr[j]+brr[m]<=count){
                break;
              }
              if((brr[i]+brr[j]+brr[m])%k==0){
                count=Math.max(count,brr[i]+brr[j]+brr[m]);
                break;
              }
            }
          }
        }
    }
}

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值