【蓝桥日记④】2015第六届省赛(软件类)JavaA组➤答案解析

2023-05-16

【蓝桥日记④】2015第六届省赛(软件类)JavaA组➤答案解析

文章目录

    • 【蓝桥日记④】2015第六届省赛(软件类)JavaA组➤答案解析
      • 1、熊怪吃核桃
      • 2、星系炸弹
      • 3、九数分三组
      • 4、循环节长度
      • 5、打印萎形
      • 6、加法变乘法
      • 7、牌型种数
      • 8、移动距离
      • 9、垒骰子
      • 10、灾后重建

1、熊怪吃核桃

解法:暴力模拟

package sixSession;

/*** 2015第六届 1、熊怪吃核桃 ***/
public class test1 {
    public static void main(String[] args) {
        int n = 1543;
        int throwNum = 0;
        while (n > 0) {
            if (n % 2 == 1) {
                n -= 1;
                throwNum += 1;
            }
            n /= 2;
        }
        System.out.println(throwNum);
    }
}

答案:5


2、星系炸弹

解法:时间函数

package sixSession;

import java.text.SimpleDateFormat;
import java.util.Calendar;

/*** 2015第六届 2、星系炸弹 ***/
public class test2 {
    public static void main(String[] args) {
        Calendar calendar = Calendar.getInstance();
        // 注意 month 是从0开始的
        calendar.set(2014, 10, 9);
        calendar.add(calendar.DATE, 1000);
        SimpleDateFormat smdate = new SimpleDateFormat("yyyy-MM-dd");
        String sdate = smdate.format(calendar.getTime());
        System.out.println(sdate);
    }
}

答案:2017-08-05


3、九数分三组

解法:全排列+剪枝

package sixSession;

/*** 2015第六届 3、九数分三组 ***/
public class test3 {
    public static void main(String[] args) {
        int[] a = {1, 2, 3, 4, 5, 6, 7, 8, 9};
        backtrack(a, 0, 9);
    }

    private static void backtrack(int[] a, int begin, int end) {
        if (begin > 6) {
            int A = a[0] * 100 + a[1] * 10 + a[2];
            int B = a[3] * 100 + a[4] * 10 + a[5];
            if (2 * A != B) return;
        }
        if (begin == end) {
            helper(a);
            return;
        }

        for (int i = begin; i < end; i++) {
            int t = a[begin]; a[begin] = a[i]; a[i] = t;
            backtrack(a, begin + 1, end);
            t = a[begin]; a[begin] = a[i]; a[i] = t;
        }
    }

    private static void helper(int[] a) {
        int A = a[0] * 100 + a[1] * 10 + a[2];
        int B = a[3] * 100 + a[4] * 10 + a[5];
        int C = a[6] * 100 + a[7] * 10 + a[8];
        if (2 * A != B || 3 * A != C) return;
        System.out.print(A + " ");
    }
}

答案:192 219 273 327


4、循环节长度

package sixSession;

import java.util.Vector;

/*** 2015第六届 4、循环节长度 ***/
public class test4 {
    public static int f(int n, int m)
    {
        n = n % m;
        Vector v = new Vector();
        for(;;)
        {
            v.add(n);
            n *= 10;
            n = n % m;
            if(n==0) return 0;
            if(v.indexOf(n)>=0) return v.size() - v.indexOf(n);
        }
    }
    public static void main(String[] args)
    {
        System.out.println(f(1, 8));
        System.out.println(f(8, 3));
        System.out.println(f(11, 13));
        System.out.println(f(39, 190));
    }
}

答案:return v.size() - v.indexOf(n)


5、打印萎形

找规律

package sixSession;

/*** 2015第六届 5、打印萎形 ***/
public class test5 {
    public static void f(int n) {
        String s = "*";
        for (int i = 0; i < 2 * n - 3; i++) s += ".";
        s += "*";

        String s1 = s + "\n";
        String s2 = "";

        for (int i = 0; i < n - 1; i++) {
            s = "." + s.substring(0, s.length() - 3) + "*";
            s1 = s + "\n" + s1;
            s2 += s + "\n";
        }
        System.out.println(s1 + s2);
    }

    public static void main(String[] args) {
        f(7);
    }
}

答案:s.substring(0, s.length() - 3)


6、加法变乘法

解法一:排列组合+回溯法

package sixSession;

/*** 2015第六届 6、加法变乘法 ***/
public class test6 {
    public static void main(String[] args) {
        int[] a = new int[48];
        backtrack(a, 0, 48, 2);
    }

    private static void backtrack(int[] a, int begin, int end, int k) {
        if (k == 0) {
            int pos = check(a);
            if (pos != -1 && pos != 10) System.out.println(pos);
            return;
        }

        for (int i = begin; i < end; i++) {
            a[i] = 1;
            k -= 1;
            backtrack(a, i + 1, end, k);
            k += 1;
            a[i] = 0;
        }
    }

    private static int check(int[] a) {
        int sum = 1, pos = -1;
        boolean multi = false;
        for (int i = 0; i < 48; i++) {
            if (a[i] == 0) {
                sum += i + 2;
                multi = false;
            } else {
                if (multi == false) {
                    if (pos == -1) pos = i + 1;
                    sum -= (i + 1);
                    sum += (i + 1) * (i + 2);
                } else {
                    return -1;
                }
                multi = true;
            }
        }
        return sum == 2015 ? pos : -1;
    }
}

解法二:枚举

package sixSession;

/*** 2015第六届 6、加法变乘法 枚举法 ***/
public class test6_2 {
    public static void main(String[] args) {
        for (int i = 1; i <= 46; i++) {
            for (int j = i + 2; j <= 48; j++) {
                if (i * (i + 1) - (i + i + 1) + j * (j + 1) - (j + j + 1) == 2015 - 1225) {
                    if (i != 10) System.out.println(i);
                }
            }
        }
    }
}

答案:16


7、牌型种数

排列组合+递归

package sixSession;

/*** 2015第六届 7、牌型种数 ***/
public class test7 {
    private static int ans;
    public static void main(String[] args) {
        f(0, 0);
        System.out.println(ans);
    }

    private static void f(int k, int cnt) {
        if (k > 13 || cnt > 13) return;
        if (k == 13 && cnt == 13) {
            ans++;
            return;
        }
        for (int i = 0; i < 5; i++) {
            f(k + 1, cnt + i);
        }
    }
}

答案:3598180


8、移动距离

推理坐标

package sixSession;

import java.util.Scanner;

/*** 2015第六届 8、移动距离 ***/
public class test8 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int w = sc.nextInt();
        int m = sc.nextInt();
        int n = sc.nextInt();
        sc.close();

        int rm = m % w == 0 ? m / w : m / w + 1;
        int rn = n % w == 0 ? n / w : n / w + 1;
        int cm = rm % 2 == 0 ? ((w - m % w + 1) % w) : m % w;
        int cn = rn % 2 == 0 ? ((w - n % w + 1) % w) : n % w;

        int ans = Math.abs(rm - rn) + Math.abs(cm - cn);
        System.out.println(ans);
    }
}

9、垒骰子

解法一:递归(3/5),heap超出内存

package sixSession;

import java.util.Scanner;

/*** 2015第六届 9、垒骰子 递归 ***/
public class test9 {
    static final int mod = (int)1e9 + 7;
    static final int[] op = {0, 4, 5, 6, 1, 2, 3};
    static boolean[][] conflict = new boolean[7][7];

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt(), m = sc.nextInt();
        for (int i = 0; i < m; i++) {
            int x = sc.nextInt(), y = sc.nextInt();
            conflict[x][y] = true;
            conflict[y][x] = true;
        }
        sc.close();

        long ans = 0;
        for (int up = 1; up <= 6; up++) {
            ans = (ans +  4 * f(up, n - 1)) % mod;
        }
        System.out.println(ans);
    }

    private static long f(int up, int cnt) {
        if (cnt == 0) {
            return 1;
        }
        long ans = 0;
        for (int u = 1; u <= 6; u++) {
            if (conflict[op[up]][u]) continue;
            ans = (ans + 4 * f(u, cnt - 1)) % mod;
        }
        return ans;
    }
}

解法二:动态规划(4/5)超时

package sixSession;

import java.util.Scanner;

/*** 2015第六届 9、垒骰子 动态规划 ***/
public class test9_2 {
    static final int mod = (int)1e9 + 7;
    static final int[] op = {0, 4, 5, 6, 1, 2, 3};
    static boolean[][] conflict = new boolean[7][7];
    static int[][] dp = new int[2][7];

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt(), m = sc.nextInt();
        for (int i = 0; i < m; i++) {
            int x = sc.nextInt(), y = sc.nextInt();
            conflict[x][y] = true;
            conflict[y][x] = true;
        }
        sc.close();

        // dp[i][j] 表示在第i层j朝上的方案数
        for (int j = 1; j <= 6; j++) dp[0][j] = 1;

        int cur = 0;
        // 迭代层数
        for (int level = 2; level <= n; level++) {
            cur = 1 - cur; // 滚动数组下标
            //尝试将6个面放在当前一面朝上的方向
            for (int j = 1; j <= 6; j++) {
                dp[cur][j] = 0;
                for (int i = 1; i <= 6; i++) {
                    if (conflict[op[j]][i]) continue;;
                    dp[cur][j] = (dp[cur][j]+ dp[1 - cur][i]) % mod;
                }
            }
        }

        long sum = 0;
        for (int k = 1; k <= 6; k++) {
            sum = (sum + dp[cur][k]) % mod;
        }

        // 利用快速幂求4的n次幂
        long ans = 1;
        long tmp = 4, p = n;
        while (p > 0) {
            if ((p & 1) == 1) {
                ans = ans * tmp % mod;
            }
            tmp = tmp * tmp % mod;
            p >>= 1;
        }

        ans = ans * sum % mod;
        System.out.println(ans);
    }
}

解法三:冲突矩阵的快速幂(AC),长见识了!Σ(⊙▽⊙"a

package sixSession;

import java.util.Map;
import java.util.Scanner;

/*** 2015第六届 9、垒骰子 矩阵乘法 ***/
class M {
    long[][] a = new long[6][6];
    public M() {
        for (int i = 0; i < 6; i++) {
            for (int j = 0; j < 6; j++) {
                a[i][j] = 1;
            }
        }
    }
}

public class test9_3 {
    static final int MOD  = (int)1e9 + 7;
    static final int[] op = {0, 4, 5, 6, 1, 2, 3};


    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt(), m = sc.nextInt();
        M cMatrix = new M(); // 冲突矩阵
        for (int i = 0; i < m; i++) {
            int x = sc.nextInt(), y = sc.nextInt();
            cMatrix.a[op[x] - 1][y - 1] = 0;
            cMatrix.a[op[y] - 1][x - 1] = 0;
        }
        sc.close();

        M cMatrix_n_1 = mPow(cMatrix, n - 1);
        long sum = 0;
        for (int i = 0; i < 6; i++) {
            for (int j = 0; j < 6; j++) {
                sum = (sum + cMatrix_n_1.a[i][j]) % MOD;
            }
        }

        // 利用快速幂求4的n次幂
        long ans = 1;
        long tmp = 4, p = n;
        while (p > 0) {
            if ((p & 1) == 1) {
                ans = ans * tmp % MOD;
            }
            tmp = tmp * tmp % MOD;
            p >>= 1;
        }

        ans = ans * sum % MOD;
        System.out.println(ans);
    }

    // 利用快速幂求矩阵m的k次方
    private static M mPow(M m, int k) {
        M ans = new M(); // 单位矩阵
        for (int i = 0; i < 6; i++) {
            for (int j = 0; j < 6; j++) {
                ans.a[i][j] = (i == j) ? 1 : 0;
            }
        }
        while (k != 0) {
            if ((k & 1) == 1) {
                ans = mMultiply(ans, m);
            }
            m = mMultiply(m, m);
            k >>= 1;
        }
        return ans;
    }

    private static M mMultiply(M m1, M m2) {
        M ans = new M();

        for (int i = 0; i < 6; i++) {
            for (int j = 0; j < 6; j++) {
                ans.a[i][j] = 0;
                for (int k = 0; k < 6; k++) {
                    ans.a[i][j] = (ans.a[i][j] + m1.a[i][k] * m2.a[k][j]) % MOD;
                }
            }
        }

        return ans;
    }
}

10、灾后重建

解法:最小生成树+并查集+线段树

选择暂时放弃~o(╥﹏╥)o


[参考资料:B站【蓝桥杯JavaA组】2013-2018年试题讲解(附含C语言版)](

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【蓝桥日记④】2015第六届省赛(软件类)JavaA组➤答案解析 的相关文章

  • ubuntu 显示未找到wifi适配器

    装好ubuntu 后 wifi不可用 xff0c 显示未找到wifi适配器 xff0c 由于我的网卡是BCM43142 802 11b g n rev 01 比较老 按照这个网址 xff08 https blog csdn net napo
  • Mybatis-Plus-Generator源码解读

    首先 xff0c 从AutoGenerator类的execute方法进入 生成代码 public void execute logger debug 34 61 61 61 61 61 61 61 61 61 61 61 61 61 61
  • Xfce+VNC+XRDP实现远程桌面连接的方法

    本文介绍在CentOS 7 3下安装Xfce 43 VNC 43 XRDP实现远程桌面连接的方法 xff0c 使用root用户进行操作 1 配置前准备 升级更新 xff08 可选 xff09 更新资源 xff0c 避免资源过旧出现问题 yu
  • 视频超分——02 VESPCN

    Real Time Video Super Resolution with Spatio Temporal Networks and Motion Compensation 参考资料 xff1a 论文内容 xff1a https blog
  • 002 在树莓派zero w上安装 VNC

    前言 有时直接在树莓派上工作并不方便 也许您想通过远程控制从另一台设备进行处理 VNC 是一个图形桌面共享系统 xff0c 允许您从另一台计算机或移动设备 xff08 运行 VNC 查看器 xff09 远程控制一台计算机 xff08 运行
  • SRFBN阅读笔记

    文章出自cvpr2019 全称 xff1a Feedback Network for Image Super ResolutionFB层的两个输入 xff08 规定F out 1是F in 0 xff09 先做concatenate xff
  • 升级cmake到3.6.2

    CMake 到 3 6 2 https cmake org download CentOS 7 span class token punctuation span root 64 thrift1 span class token punct
  • dpkg强制卸载

    dpkg的一个强制卸载的方法 安mysql的时候因为玄学国家防火墙 xff0c 安到一般被阻断了 xff0c 再卸的时候各种依赖不对 xff0c dpkg r P怎么都卸不掉 xff0c 提示有依赖卸载包的东西 xff0c 找到一个 for
  • Python打包(构建)、分发、安装 简要介绍

    1 为什么要打包分发 平时我们习惯了使用pip安装一些package xff0c 但是如果想自己写一些package供别人使用 xff0c 就需要打包分发 打包 xff08 构建 xff09 xff1a 将自己的源代码打包封装成packag
  • 树莓派3b安装nginx 2018.12.31

    sudo apt get update sudo apt get upgrade sudo apt get remove apache2 据说如果系统自带apache2的话 xff0c apache2会占用80端口 xff0c 导致影响ng
  • 双系统:解决ubuntu18.04系统开机黑屏的问题(ubuntu20.04,ubuntu16.04适用)

    安装ubuntu双系统 xff1a 点击第三个U盘安装方式 xff1a 安装ubuntu xff1a 会出现黑屏现象 xff1a 重启电脑 xff08 一般是长按开机键 xff09 xff0c 在下面这个界面按e xff0c 注意不是回车是
  • WSL 下 Ubuntu 20.04 中文显示设置

    环境 系统 xff1a Windows 10 Pro 64 子系统 xff1a Ubuntu 20 04 LTS 查看本地语言包 xff0c 安装语言包 locale a 查看现有语言包 span class token function
  • linux网络测试工具

    工具 iperf 网络性能测试工具 测试组播 xff1a iperf s u B lt 组播地址 gt i lt 结果显示间隔 gt iperf s u B 231 1 2 1 i 1 iperf c lt 组播地址 gt u T lt T
  • python检查一个变量的类型

    1 只想知道某个变量的数据类型 xff1a python中判断一个变量的数据类型可以用 type 变量名 函数 xff1a gt gt gt rectangle 61 200 50 gt gt gt type rectangle lt cl
  • Windows10中wsl2安装kali子系统加GUI

    环境 win10专业工作站 操作 确定后重启 配置先决条件 In Windows Powershell 管理员 Enable WindowsOptionalFeature Online FeatureName Microsoft Windo
  • vue项目中使用ramda库

    先安装ramda库 npm i ramda 在main js中引入 import as R from 39 ramda 39 Vue prototype R 61 R
  • Get请求体中转义字符及URI编码

    参考 xff1a 转义字符及URI编码 weixin 30678349的博客 CSDN博客 获取职级类型的列表 getRankTypeList var sql 61 96 select COMMENTS from user col comm
  • 使用jar命令替换jar|war包中指定文件

    一 jar命令用法 span class token operator span c 创建新的归档文件 span class token operator span t 列出归档目录和文件 span class token operator
  • Windows编程UTF-8,UTF-16,ASCII,宽字节,窄字节等编码问题汇总

    宽字节输出乱码问题 span class token macro property span class token directive hash span span class token expression Unicode 字符集 s
  • 前端基础--NPM包管理工具

    NPM包管理工具 关键字 xff1a NPM包资源管理器 pdf 提示 xff1a 经常使用的命令 xff0c 一些生产常见问题记录 文章目录 NPM包管理工具一 常用命令 一 常用命令 span class token number 1

随机推荐