【蓝桥日记③】2016第七届省赛(软件类)JavaA组✿答案解析

2023-05-16

【蓝桥日记③】2016第七届省赛(软件类)JavaA组✿答案解析

文章目录

    • 【蓝桥日记③】2016第七届省赛(软件类)JavaA组✿答案解析
      • 1、煤球数目
      • 2、生日蜡烛
      • 3、搭积木
      • 4、分小组
      • 5、抽签
      • 6、寒假作业
      • 7、剪邮票
      • 8、取球博弈
      • 9、交换瓶子
      • 10、压缩变换

官网题库中搜索相应题目

1、煤球数目

考点:找规律,模拟求和

package sevenSession;

/*** 2016第七届  1、煤球数目 ***/
public class test1 {
    public static void main(String[] args) {
        int pre = 1, res = 1;
        for (int i = 2; i <= 100; i++) {
            pre += i;
            res += pre;
        }
        System.out.println(res);
    }
}

答案:171700


2、生日蜡烛

考点:暴力枚举

package sevenSession;

/*** 2016第七届  2、生日蜡烛 ***/
public class test2 {
    public static void main(String[] args) {
        int candles = 236, begin = 0;
        for (int j = 1; j <= 100; j++) {
            int k = j, sum = 0;
            while (sum < candles) {
                sum += k;
                k += 1;
            }
            if (sum == candles) {
                begin = j;
                break;
            }
        }
        System.out.println(begin);
    }
}

答案:26


3、搭积木

考点:全排列

package sevenSession;

/*** 2016第七届  3、搭积木 ***/
public class test3 {
    static int res;

    public static void main(String[] args) {
        int[] a = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
        res = 0;
        backtrack(a, 0, a.length);

        System.out.println(res);
    }

    static private void backtrack(int[] a, int begin, int end) {
        if (begin == end) {
            if (check(a)) res++;
            return;
        }
        for (int i = begin; i < end; i++) {
            int t = a[i]; a[i] = a[begin]; a[begin] = t;
            backtrack(a, begin + 1, end);
            t = a[i]; a[i] = a[begin]; a[begin] = t;
        }
    }

    static private boolean check(int[] a) {
        if (a[0] > a[1] || a[0] > a[2]) return false;
        if (a[1] > a[3] || a[1] > a[4]) return false;
        if (a[2] > a[4] || a[2] > a[5]) return false;
        if (a[3] > a[6] || a[3] > a[7]) return false;
        if (a[4] > a[7] || a[4] > a[8]) return false;
        if (a[5] > a[8] || a[5] > a[9]) return false;
        return true;
    }
}

答案:768


4、分小组

考点:排列组合

package sevenSession;

/*** 2016第七届  4、分小组 ***/
public class test4 {
    public static String remain(int[] a) {
        String s = "";
        for (int i = 0; i < a.length; i++) {
            if (a[i] == 0) s += (char) (i + 'A');
        }
        return s;
    }

    public static void f(String s, int[] a) {
        for (int i = 0; i < a.length; i++) {
            if (a[i] == 1) continue;
            a[i] = 1;
            for (int j = i + 1; j < a.length; j++) {
                if (a[j] == 1) continue;
                a[j] = 1;
                for (int k = j + 1; k < a.length; k++) {
                    if (a[k] == 1) continue;
                    a[k] = 1;
                    if (k == 3)
                        System.out.println(s + " " + (char)(i + 'A') + (char)(j + 'A') + (char)(k + 'A') + " " + remain(a));
                    a[k] = 0;
                }
                a[j] = 0;
            }
            a[i] = 0;
        }
    }

    public static void main(String[] args) {
        int[] a = new int[9];
        a[0] = 1;

        for (int b = 1; b < a.length; b++) {
            a[b] = 1;
            for (int c = b + 1; c < a.length; c++) {
                a[c] = 1;
                String s = "A" + (char) (b + 'A') + (char) (c + 'A');
                f(s, a);
                a[c] = 0;
            }
            a[b] = 0;
        }
    }
}

答案:System.out.println(s + " " + (char)(i + 'A') + (char)(j + 'A') + (char)(k + 'A') + " " + remain(a));


5、抽签

考点:排列组合+递归

package sevenSession;

/*** 2016第七届  5、抽签 ***/
public class test5 {
    public static void f(int[] a, int k, int n, String s) {
        if (k == a.length) {
            if (n == 0) System.out.println(s);
            return;
        }

        String s2 = s;
        for (int i = 0; i <= a[k]; i++) {
            f(a, k + 1, n - i, s2);
            s2 += (char) (k + 'A');
        }
    }

    public static void main(String[] args) {
        int[] a = {4, 2, 2, 1, 1, 3};
        f(a, 0, 5, "");
    }
}

答案:f(a, k + 1, n - i, s2);


6、寒假作业

考点:排列组合

package sevenSession;

/*** 2016第七届  6、剪邮票 ***/
public class test6 {
    static int res;
    public static void main(String[] args) {
        int[] a = new int[13];
        for (int i = 1; i <= 13; i++) a[i - 1] = i;
        res = 0;
        backtrack(a, 0, 13);

        System.out.println(res);
    }

    static private void backtrack(int[] a, int begin, int end) {
        if (begin == end && check(a)) {
            res++;
            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;
        }
    }

    static private boolean check(int[] a) {
        return a[0] + a[1] == a[2] && a[3] - a[4] == a[5] &&
                a[6] * a[7] == a[8] && (a[9] % a[10] == 0 && a[9] / a[10] == a[11]);
    }
}

答案:64


7、剪邮票

考点:组合问题+DFS

package sevenSession;

import java.util.ArrayDeque;
import java.util.Queue;

/*** 2016第七届  7、剪邮票 ***/
public class test7 {
    static int res = 0;
    public static void main(String[] args) {
        int[] a = new int[12];

        backtrack(a, 0, 12, 5);
        System.out.println(res);
    }

    static private void backtrack(int[] a, int begin, int end, int k) {
        if (end - begin + 1 < k) return;
        if (k == 0) {
            if(check(a)) res++;
        }
        for (int i = begin; i < end; i++) {
            a[i] = 1;
            backtrack(a, i + 1, end, k - 1);
            a[i] = 0;
        }
    }

    static private boolean check(int[] a) {
        Queue<int[]> queue = new ArrayDeque<>();
        boolean[] mark = new boolean[12];
        for (int i = 0; i < 12; i++) {
            if (a[i] == 1) {
                queue.offer(new int[]{i / 4, i % 4});
                mark[i] = true;
                break;
            }
        }

        if (queue.isEmpty()) return false;
        int cnt = 1;
        int[] dirs = {-1, 0, 1, 0, -1};
        while (!queue.isEmpty()) {
            int[] cur = queue.poll();
            for (int i = 0; i < 4; i++) {
                int x = cur[0] + dirs[i], y = cur[1] + dirs[i + 1];
                int xy = x * 4 + y;
                if (x < 0 || y < 0 || x >= 3 || y >= 4) continue;
                if (a[xy] == 0 || mark[xy]) continue;
                queue.offer(new int[]{x, y});
                mark[xy] = true;
                cnt++;
            }
        }

        return cnt == 5;
    }
}

答案:116


8、取球博弈

考点:博弈+记忆化搜索

package sevenSession;

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

/*** 2016第七届  8、取球博弈 ***/
public class test8 {
    static int[] ns = new int[3];
    static char[][][] cache = new char[1000][2][2];
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        for (int i = 0; i < 3; i++) ns[i] = sc.nextInt();
        Arrays.sort(ns);
        char[] res = new char[5];
        for (int i = 0; i < 5; i++) {
            int num = sc.nextInt();
            res[i] = f(num, 0, 0);
        }
        sc.close();
        for (char c : res) System.out.print(c + " ");
    }

    private static char f(int num, int me, int you) {
        if (num < ns[0]) {
            if ((me & 1) == 1 && (you & 1) == 0) {
                cache[num][me][you] = '+';
                return '+';
            } else if ((me & 1) == 0 && (you & 1) == 1) {
                cache[num][me][you] = '-';
                return '-';
            } else {
                cache[num][me][you] = '0';
                return '0';
            }
        }

        if (cache[num][me][you] != '\0') return cache[num][me][you];

        boolean fair = false;
        for (int n : ns) {
            if (num >= n) {
                char c = f(num - n, you, (me + n) % 2);
                if (c == '-') {
                    cache[num][me][you] = '+';
                    return '+';
                } else if (c == '0') {
                    fair = true;
                }
            }
        }
        if (fair) {
            cache[num][me][you] = '0';
            return '0';
        }
        cache[num][me][you] = '-';
        return '-';
    }
  
}

9、交换瓶子

package sevenSession;
import java.util.Scanner;

/*** 2016第七届  9、交换瓶子 ***/
public class test9 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[] ns = new int[n + 1];
        for (int i = 0; i < n; i++) {
            ns[i + 1] = sc.nextInt();
        }
        sc.close();

        int res = 0, i = 1, j = 0;
        while (i <= n) {
            if (i != ns[i]) {
                for (j = i + 1; j <= n; j++) {
                    if (ns[j] == i) break;
                }
                int t = ns[i];
                ns[i] = ns[j];
                ns[j] = t;
                res++;
                continue;
            }
            i++;
        }

        System.out.println(res);
    }
}

10、压缩变换

方法一:暴力法(4/8)

package sevenSession;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Scanner;

/*** 2016第七届  10、压缩变换 ***/
public class test10 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[] nums = new int[n];
        for (int i = 0; i < n; i++) nums[i] = sc.nextInt();
        sc.close();

        int[] res = new int[n];
        HashMap<Integer, Integer> map = new HashMap<>();
        for (int i = 0; i < n; i++) {
            if (!map.containsKey(nums[i])) {
                res[i] = -nums[i];
            } else {
                res[i] = getKinds(nums, map.get(nums[i]), i);
            }
            map.put(nums[i], i);
        }

        for (int x : res) System.out.print(x + " ");
    }

    private static int getKinds(int[] nums, int begin, int end) {
        HashSet<Integer> set = new HashSet<Integer>();
        for (int i = begin + 1; i < end; i++) set.add(nums[i]);
        return set.size();
    }

}

方法二:线段树,区间查询(AC)

线段树知识可以参考我的往期总结:高级数据结构(Ⅲ)线段树(Segment Tree)

package sevenSession;

import java.util.HashMap;
import java.util.Scanner;

/*** 2016第七届  10、压缩变换 线段树区间查询 ***/
public class test10_2 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[] nums = new int[n];
        for (int i = 0; i < n; i++) nums[i] = sc.nextInt();
        sc.close();

        SegmentTree segTree = new SegmentTree();
        int[] res = new int[n];
        HashMap<Integer, Integer> map = new HashMap<>();
        for (int i = 0; i < n; i++) {
            if (!map.containsKey(nums[i])) {
                res[i] = -nums[i];
                segTree.update(i, 1);
            } else {
                res[i] = segTree.query(map.get(nums[i]) + 1, i - 1);
                segTree.update(map.get(nums[i]), 0);
                segTree.update(i, 1);
            }
            map.put(nums[i], i);
        }

        for (int x : res) System.out.print(x + " ");
    }
}

class SegmentTree {
    private static final int N = 100001;

    private TreeNode root;
    class TreeNode {
        TreeNode left, right;
        int cnt;
    }

    public SegmentTree() {
        root = new TreeNode();
    }

    public void update(int index, int val) {
        root = update(root, 0, N, index, val);
    }

    private TreeNode update(TreeNode node, int low, int high, int index, int val) {
        createNode(node);
        if (low == high && low == index) {
            node.cnt = val;
            return node;
        }
        int mid = low + (high - low) / 2;
        if (index >= low && index <= mid) {
            node.left = update(node.left, low, mid, index, val);
        } else {
            node.right = update(node.right, mid + 1, high, index, val);
        }
        node.cnt = node.left.cnt + node.right.cnt;
        return node;
    }

    public int query(int L, int R) {
        return query(root, 0, N, L, R);
    }

    private int query(TreeNode node, int low, int high, int L ,int R) {
        if (low > R || high < L) return 0;
        if (low >= L && high <= R) return node.cnt;
        int mid = low + (high - low) / 2;
        int sumLeft  = query(node.left, low, mid, L, R);
        int sumRight = query(node.right, mid + 1, high, L, R);
        return sumLeft + sumRight;
    }

    private void createNode(TreeNode node) {
        if (node.left == null) node.left = new TreeNode();
        if (node.right == null) node.right = new TreeNode();
    }

}

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

高级数据结构(Ⅲ)线段树(Segment Tree)

3~7是排列组合题,只要会一个,举一反三。取球博弈,想想还是第一次真正做博弈的题目呢,之前只刷过简单的题,现在用记忆化搜索和递归来进行模拟,很有趣。最后一道题压缩变换又用到了线段树区间求和,算是对前面的学习巩固了下。还是那句话,加油加油ヾ(◍°∇°◍)ノ゙!

在这里插入图片描述

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

【蓝桥日记③】2016第七届省赛(软件类)JavaA组✿答案解析 的相关文章

  • Linux安装ns2(Ubuntu/国产统信UOS系统可用)

    目录 1 安装必要编译工具2 安装tcl8 53 安装tk8 54 安装gcc54 1检查gcc版本4 2安装gcc54 3更改gcc g 43 43 优先级 5 安装ns26 配置环境变量7 测试ns2 此教程适用于ubuntu系统和国产
  • 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

随机推荐