第十四届蓝桥杯打卡day22

1、受伤的皇后

经典题,注意对角线的判断,距离3+不用管

题目描述

有一个 n×n 的国际象棋棋盘(n 行 n 列的方格图),请在棋盘中摆放 n 个受伤的国际象棋皇后,要求:

  1. 任何两个皇后不在同一行。
  2. 任何两个皇后不在同一列。
  3. 如果两个皇后在同一条 45 度角的斜线上,这两个皇后之间行号的差值至少为 3 。

请问一共有多少种摆放方案。

输入描述

输入的第一行包含一个整数 n。

其中,1≤n≤10。

输出描述

输出一个整数,表示答案。

输入输出样例

示例 1

输入

4

输出

2

import java.util.Scanner;

public class Main {
    public static int sum = 0;
    public static int n;
    public static int[] a = new int[110];
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        n = sc.nextInt();
        dfs(1);
        System.out.println(sum);
    }

    public static void dfs(int row) {
        if (row > n) {//一种摆放方案
            sum++;
            return;
        }
        for (int i = 1; i <= n; i++) {//遍历能放的列
            if (check(row, i)) {
                a[row] = i;
                dfs(row + 1);
                a[row] = 0;//回溯
            }
        }
    }

    public static boolean check(int r, int c) {
        for (int i = 1; i <= r; i++) {//枚举r行可以放置的列
            if (a[i] == c) {//如果有列和当前放置的所有皇后有列冲突则返回false
                return false;
            }
           if(Math.abs(r-i)==Math.abs(a[i]-c)){//只要已经有的皇后在将要放置的皇后在同一条对角线上,其行号与列号对应相减的绝对值绝对是相等的
             return false;//例如:正对角线情况,(2,2)(1,1)2-2==1-1  次对角线情况,(3,2)(2,3)3-2==2-3
           }              //所以我们只需要用abs判断即可
        }
        return true;
    }
}

2、完全平方数

问题描述

一个整数 a 是一个完全平方数, 是指它是某一个整数的平方, 即存在一个 整数 b, 使得 a=b2 。

给定一个正整数 n, 请找到最小的正整数 x, 使得它们的乘积是一个完全平 方数。

输入格式

输入一行包含一个正整数 n 。

输出格式

输出找到的最小的正整数 x 。

样例输入 1

12

样例输出 1

3

样例输入 2

15

样例输出 2

15

评测用例规模与约定

对于 30 的评测用例, 1≤n≤1000, 答案不超过 1000 。

对于 60 的评测用例, 1≤n≤108, 答案不超过 108108 。

对于所有评测用例, 1≤n≤1012, 答案不超过 10121012 。

第一次暴力过40%

第十四届蓝桥杯打卡day22_第1张图片

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

public class Main {
  static long n = 0L;
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        n = sc.nextLong();
        for(long i = 1;i<=n;i++){
            if(i*n==check(i)){
              System.out.println(i);
              return;
            }
        }
    }
    static long check(long i){
      for(long j=1;j<=n;j++){
        if(i*n==j*j){
          return j*j;
        }
      }
      return 0;
    }
}

 2、简便方法

import java.util.*;
public class Main {
    static long n = 0L;
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        n = sc.nextLong();
        long res =0L;
        for(long i =1;i<=Math.sqrt(n);i++) {
            if(n % (i*i) == 0) {//一个数如果是完全平方数则其所有质因子出现的频率均为偶数
                res = n / (i * i);
            }
        }
        System.out.println(res);
    }
    
}

4、求阶乘

问题描述

满足 N ! 的末尾恰好有 K 个 0 的最小的 N 是多少?

如果这样的 N 不存在输出 −1 。

输入格式

一个整数 K 。

输出格式

一个整数代表答案。

样例输入

2

样例输出

10

评测用例规模与约定

对于 30%30% 的数据, 1≤K≤106.

对于 100%100% 的数据, 1≤K≤1018.

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

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        long k = sc.nextLong();
        long l = 0L;
        long r = Long.MAX_VALUE;
        while(l>1;//数字目标在二分的左边
          if(check(mid)>=k){//找到符合条件的最小数
            r = mid;
          }
          else{
            l = mid+1;
          }
        }
          if(check(r)==k){
            System.out.println(r);
          }
          else{
            System.out.println(-1);
          }
    }
    static long check(long n){//一个数的阶乘,其包含几个5即为末尾0的个数,参考唯一分解定理,例如10!=3628800,10/5=2
      long res = 0L;
      while(n>0){
        res+=n/5;
        n/=5;
      }
      return res;
    }
}

你可能感兴趣的:(蓝桥杯,java,职场和发展)