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

  • Post author:
  • Post category:java



目录


一、合法日期


解析:


代码:


二、古堡算式


解析:


代码:


三、估计人数


解析:


代码:


四、蓝跳跳


解析:


代码:


五、乘积最大


解析:


代码:


一、合法日期


原题链接

解析:

简单判断一下日期就好,在比赛中俗称:签到题!!!

代码:

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

public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int a=scan.nextInt();
        int b=scan.nextInt();
        int []arr={31,28,31,30,31,30,31,31,30,31,30,31};
        if(a<=12&&arr[a-1]>=b){
          System.out.println("yes");
        }else{
          System.out.println("no");
        }
    }
}

二、古堡算式


原题链接

解析:

第二个签到题,基础dfs,当然也可以用6for做

代码:

public class 古堡算式 {
    static int []arr={1,2,3,4,5,6,7,8,9,0};
    public static void main(String[] args) {
        dfs(0);
    }
    public static void dfs(int step){
        if (step==6){
            check();
            return;
        }
        for (int i=step;i<arr.length;i++){
            swap(i,step);
            dfs(step+1);
            swap(i,step);
        }
    }
    public static void swap(int i,int j){
        int t=arr[i];
        arr[i]=arr[j];
        arr[j]=t;
    }
    public static void check() {
        if (arr[0]!=0){
            if ((arr[0]*10000+arr[1]*1000+arr[2]*100+arr[3]*10+arr[4])*arr[5]==
                    arr[4]*10000+arr[3]*1000+arr[2]*100+arr[1]*10+arr[0]){
                System.out.print(arr[0]*10000+arr[1]*1000+arr[2]*100+arr[3]*10+arr[4]);
            }
        }
    }
}

三、估计人数


题目链接

解析:

这题简单的《搜一搜,判一判》

题目给定条件每一次只能往下走或者往右走,所以我们先设置一个优先级:在遇到可以同时往右和往下的情况下,我们优先级为先向右再向下;

然后我们分以下情况:如果经历过多个连续转角,遇到有转角的时候,我们要考虑一下它的上方是否有没有经过的位置;如果有,那么这个点的值我们就可以选择不去更改;

第三次,如果周围的值都走过,那么还是一样,优先级为向右走,因为可能出现一个位置多个人经过;

然后每一次搜索起点走的位置是,赋一个值,来记录路线;

代码:

import java.util.LinkedList;
import java.util.Queue;
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 [][]arr=new int[n][m];
        String ss;
        for (int i=0;i<n;i++){
            ss=sc.next();
            for (int j=0;j<m;j++){
                if (ss.charAt(j)=='1')
                    arr[i][j]=-1;
                else arr[i][j]=-2;
            }
        }
        int s=1;
        Queue<Integer>qx=new LinkedList<>();
        Queue<Integer>qy=new LinkedList<>();
        for (int i=0;i<n;i++){
            for (int j=0;j<m;j++){
                if (arr[i][j]==-1){
                    qx.add(i);
                    qy.add(j);
                    while (!qx.isEmpty()){
                        int x=qx.poll(),y= qy.poll();
                        arr[x][y]=s;
                        if (x-1>=0&&y-1>=0&&x+1<n&&y+1<m&&arr[x+1][y]==-1&&arr[x][y+1]==-1){
                            if (arr[x-1][y+1]!=-1) {
                                qx.add(x);
                                qy.add(y + 1);
                                arr[x][y + 1] = s;
                            }
                            else{
                                qx.add(x+1);
                                qy.add(y);
                                arr[x+1][y]=s;
                            }
                        }else if (y+1<m&&arr[x][y+1]==-1){
                            qx.add(x);
                            qy.add(y+1);
                            arr[x][y+1]=s;
                        }else  if (x+1<n&&arr[x+1][y]==-1){
                            qx.add(x+1);
                            qy.add(y);
                            arr[x+1][y]=s;
                        }
                        else if (y+1<m&&arr[x][y+1]!=-2){
                            qx.add(x);
                            qy.add(y+1);
                            arr[x][y+1]=s;
                        }else  if (x+1<n&&arr[x+1][y]!=-2){
                            qx.add(x+1);
                            qy.add(y);
                            arr[x+1][y]=s;
                        }
                    }
                    s+=1;
                }
            }
        }
        System.out.println(s-1);
    }
}

四、蓝跳跳


原题链接

解析:国赛A组J题,我是不会了,谁会谁写!!!

代码:没有代码!!!

五、乘积最大


原题链接

解析:

分情况考虑:取奇数个和取偶数个

取奇数个的时候,判断是否存在正数,如果存在,提出最大的正数,然后每一次都是用最小的两个负数的乘积和最大的两个正数的乘积对比,选择大的那一组;

不存在正数,从大往小依次取K个值;

取偶数的话直接就用上面的两边判断即可;

代码:

import java.io.*;
import java.math.BigInteger;
import java.util.*;
public class 乘积最大 {
    static BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
    static StreamTokenizer st=new StreamTokenizer(br);
    public static void main(String[] args)throws Exception {
        int n=nextInt();
        int k=nextInt();
        long []arr=new long[n];
        int a=0,b=0,c=0;
        for (int i=0;i<n;i++){
            arr[i]=nextInt();
            if (arr[i]>0){
                a++;
            }else if (arr[i]<0){
                b++;
            }else{
                c++;
            }
        }
        Arrays.sort(arr);
        long res;
        long x,y;
        BigInteger count=new BigInteger("1");
        if (k%2==1){//取奇数个
            if (a>0) {//存在大于0的数
                res = arr[n - 1];//取出最大的数;
                n--;
                k--;
                for (int i = 0; i < n; i += 2) {//剩下的数中选择
                    x = arr[i] * arr[i + 1];
                    y = arr[n - 1] * arr[n - 2];
                    if (x < y) {//比较两边大小
                        count = count.multiply(BigInteger.valueOf(y)).remainder(BigInteger.valueOf(1000000009));
                        n -= 2;
                        i -= 2;
                    } else {
                        count = count.multiply(BigInteger.valueOf(x)).remainder(BigInteger.valueOf(1000000009));
                    }
                    k -= 2;
                    if (k <= 0) {//结束
                        count = count.multiply(BigInteger.valueOf(res));//带上一开始提取出来的数
                        System.out.println(count.remainder(BigInteger.valueOf(1000000009)));
                        return;
                    }
                }
            }else if (c>0){//存在0,则输出0;
                System.out.println(0);
            }else{
                for (int i=n-1;i>=0;i--){//从大到小以此取
                    count = count.multiply(BigInteger.valueOf(arr[i])).remainder(BigInteger.valueOf(1000000009));
                    k--;
                    if (k<=0){//结束
                        System.out.println(count.remainder(BigInteger.valueOf(1000000009)));
                        return;
                    }
                }
            }
        }else{//取偶数个
            for (int i = 0; i < n; i += 2) {//取数
                x = arr[i] * arr[i + 1];
                y = arr[n - 1] * arr[n - 2];
                if (x < y) {//比较两边大小
                    count = count.multiply(BigInteger.valueOf(y)).remainder(BigInteger.valueOf(1000000009));
                    n -= 2;
                    i -= 2;
                } else {
                    count = count.multiply(BigInteger.valueOf(x)).remainder(BigInteger.valueOf(1000000009));
                }
                k -= 2;
                if (k <= 0) {//结束
                    System.out.println(count.remainder(BigInteger.valueOf(1000000009)));
                    return;
                }
            }
        }
    }
    public static int nextInt() throws Exception{
        st.nextToken();
        return (int)st.nval;
    }
}



版权声明:本文为qq_55668645原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。