【蓝桥日记⑥】2013第四届省赛(软件类)JavaA组@答案解析

2023-05-16

【蓝桥日记⑥】2013第四届省赛(软件类)JavaA组@答案解析

文章目录

    • 【蓝桥日记⑥】2013第四届省赛(软件类)JavaA组@答案解析
      • 1、世界末的星期
      • 2、振兴中华
      • 3、梅森素数
      • 4、颠倒的价牌
      • 5、三部排序
      • 6、逆波兰表达式
      • 7、错误票据
      • 8、**带分数**
      • 9、剪格子
      • 10、大臣的旅费

1、世界末的星期

解法:日期函数Calendar

package fourSession;

import java.util.Calendar;

/***  2013第四届省赛  1、世纪末的星期 ***/
public class test1 {
    public static void main(String[] args) {
        Calendar calendar = Calendar.getInstance();
        int year = 1999;
        for (year = 1999; year < 1000000; year += 100) {
            calendar.set(year, 11, 31);
            if (calendar.get(Calendar.DAY_OF_WEEK) == 1) break;
        }
        System.out.println(year);
    }
}

答案:2299


2、振兴中华

解法:dfs

package fourSession;

/***  2013第四届省赛  2、振兴中华 ***/
public class test2 {
    // 从 我 做 起 振 兴 中 华
    // 1  2  3 4  5  6 7  8
    static int[][] g = {{1, 2, 3, 4, 5}, {2, 3, 4, 5, 6}, {3, 4, 5, 6, 7}, {4, 5, 6, 7, 8}};
    static int ans = 0;
    public static void main(String[] args) {
        dfs(0, 0, 1);
        System.out.println(ans);
    }

    private static void dfs(int x, int y, int pre) {
        if (x == 3 && y == 4) {
            ans++;
            return;
        }
        if (x + 1 < 4 && g[x + 1][y] == pre + 1) dfs(x + 1, y, pre + 1);
        if (y + 1 < 5 && g[x][y + 1] == pre + 1) dfs(x, y + 1, pre + 1);
    }
}

答案:35


3、梅森素数

解法:BigInteger

package fourSession;

import java.math.BigInteger;

/***  2013第四届省赛  3、梅森素数 ***/
public class test3 {
    public static void main(String[] args) {
        BigInteger x = BigInteger.TWO;
        x = x.pow(11213);
        x = x.subtract(BigInteger.ONE);
        String sx = x.toString();
        String ans = sx.substring(sx.length() - 100, sx.length());
        System.out.println(ans);
    }
}

答案:8586718527586602439602335283513944980064327030278104224144971883680541689784796267391476087696392191


4、颠倒的价牌

解法:暴力枚举

package fourSession;

import java.io.CharArrayReader;
import java.util.ArrayList;

/***  2013第四届省赛  4、颠倒的价牌 ***/
public class test4 {
    static class Price{
        int p; //原价
        int rp; //颠倒价
        Price(int p, int rp) {
            this.p = p;
            this.rp = rp;
        }
    }
    static ArrayList<Price> a1 = new ArrayList<>();
    static ArrayList<Price> a2 = new ArrayList<>();

    public static void main(String[] args) {
        // 枚举四位数,简单筛选,将赔200多的和赚800多的分别加入集合
        // 遍历集合的两两组合,求差为558的组合
        for (int i = 1000; i <= 9999; i++) {
            int ri = reverseI(i);
            if (i - ri > -300 && i - ri < -200) a1.add(new Price(i, ri));
            if (i - ri > 800 && i - ri < 900) a2.add(new Price(i, ri));
        }

        boolean find = false;
        for (Price a : a1) {
            for (Price b : a2) {
                if (a.p - a.rp + b.p - b.rp ==558) {
                    System.out.println(a.rp);
                    find = true;
                    break;
                }
            }
            if (find) break;
        }
    }

    private static int reverseI(int x) {
        char[] cs = (x + "").toCharArray();
        if (cs[0] == '0' || cs[3] == '0') return 1;
        int ans = 0, t = 1;
        for (int i = 0; i < 4; i++) {
            if (cs[i] == '3' || cs[i] == '4' || cs[i] == '7') return 1;
            if (cs[i] == '2') {
                cs[i] = '5';
            } else if (cs[i] == '5') {
                cs[i] = '2';
            } else if (cs[i] == '6') {
                cs[i] = '9';
            } else if (cs[i] == '9') {
                cs[i] = '6';
            }
            ans += t * (cs[i] - '0');
            t *= 10;
        }
        return ans;
    }

}

答案:9088


5、三部排序

解法:三向切分排序

有兴趣的可以看看我之前的总结:排序算法总结☑▁▂▃▅▂▃▁▂▃▇▆▃▂▁

package fourSession;

/***  2013第四届省赛  5、三部排序 ***/
public class test5 {
    static void sort(int[] x) {
        int p = 0;
        int left = 0;
        int right = x.length - 1;

        while (p <= right) {
            if (x[p] < 0) {
                int t = x[left];
                x[left] = x[p];
                x[p] = t;
                left++;
                p++;
            } else if (x[p] > 0) {
                int t = x[right];
                x[right] = x[p];
                x[p] = t;
                right--;
                //p++;
            } else {
                p++;
            }
        }

        show(x);
    }

    static void show(int[] x) {
        for (int i = 0; i < x.length; i++) {
            System.out.print(x[i] + ",");
        }

        System.out.println();
    }

    public static void main(String[] args) {
        //int[] x = {25,18,-2,0,16,-5,33,21,0,19,-16,25,-3,0};
        sort(new int[]{-1, 0, 1, -2, 0, 2, -3, 0, 0, 3, -4, -5, 4, -6, 0, 5, 6});
        sort(new int[]{-1, 0, -1, -2, 0, -2, -3, 0, 0, -3, -4, -5, -4, -6, 0, -5, -6});
        sort(new int[]{1, 0, 1, 2, 0, 2, 3, 0, 0, 3, 4, 5, 4, 6, 0, 5, 6});
    }
}

答案:p++


6、逆波兰表达式

package fourSession;

/***  2013第四届省赛  6、逆波兰表达式 ***/
public class test6 {
    static int[] evaluate(String x) {
        if (x.length() == 0) return new int[]{0, 0};

        char c = x.charAt(0);
        if (c >= '0' && c <= '9') return new int[]{c - '0', 1};

        int[] v1 = evaluate(x.substring(1));
        int[] v2 = evaluate(x.substring(1 + v1[1]));

        int v = Integer.MAX_VALUE;
        if (c == '+') v = v1[0] + v2[0];
        if (c == '*') v = v1[0] * v2[0];
        if (c == '-') v = v1[0] - v2[0];

        return new int[]{v, 1 + v1[1] + v2[1]};
    }

    public static void main(String[] args) {
        System.out.println(evaluate("-+3*5+261")[0]);
        System.out.println(evaluate("+*35*42")[0]);
    }
}

答案:evaluate(x.substring(1 + v1[1]))


7、错误票据

解法一:List排序

package fourSession;

import java.util.*;

/***  2013第四届省赛  7、错误票据 ***/
public class test7 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        ArrayList<Integer> list = new ArrayList();
        sc.nextLine();
        for (int i = 0; i < n; i++) {
            String s = sc.nextLine();
            String[] ss = s.split(" ");
            for (int j = 0; j < ss.length; j++) {
                list.add(Integer.parseInt(ss[j]));
            }
        }
        sc.close();

        int less = 0, same = 0;
        Collections.sort(list);
        for (int i = 1; i < list.size(); i++) {
            if (list.get(i).equals(list.get(i - 1))) same = list.get(i);
            if (list.get(i - 1) + 2 == list.get(i)) less = list.get(i) - 1;
        }

        System.out.println(less + " " + same);
    }
}

解法二:Set集合去重

package fourSession;

import java.util.ArrayList;
import java.util.Scanner;
import java.util.TreeSet;

/***  2013第四届省赛  7、错误票据 ***/
public class test7 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        ArrayList<Integer> list = new ArrayList();
        sc.nextLine();
        for (int i = 0; i < n; i++) {
            String s = sc.nextLine();
            String[] ss = s.split(" ");
            for (int j = 0; j < ss.length; j++) {
                list.add(Integer.parseInt(ss[j]));
            }
        }
        sc.close();

        int pre = -1, less = 0, same = 0;
        TreeSet<Integer> set = new TreeSet();
        for (Integer v : list) {
            if (set.contains(v)) {
                same = v;
            }
            set.add(v);
        }

        for (Integer key : set) {
            if (pre == -1 || pre + 1 == key) {
                pre = key;
            } else {
                less = key - 1;
                break;
            }
        }

        System.out.println(less + " " + same);
    }
}

8、带分数

解法:全排列

package fourSession;

import java.util.Scanner;

/***  2013第四届省赛  8、带分数 ***/
public class test8 {
    static int N;
    static int ans = 0;
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        N = sc.nextInt();
        sc.close();
        int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9};
        backtrack(arr, 0, arr.length);
        System.out.println(ans);
    }

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

    private static boolean check(int[] arr) {
        int num1, num2, num3;
        for (int i = 1; i <= 7; i++) {
            num1 = toInt(arr, 0, i);
            if (num1 > N) return false;
            for (int j = 1; j <= 8 - i; j++) {
                num2 = toInt(arr, i, j);
                num3 = toInt(arr, i + j, 9 - i - j);
                if (num2 % num3 == 0) {
                    if (num1 + num2 / num3 == N) return true;
                }
            }
        }
        return false;
    }

    private static int toInt(int[] arr, int pos, int len) {
        int t = 1, x = 0;
        for (int i = pos + len - 1; i >= pos; i--) {
            x += arr[i] * t;
            t *= 10;
        }
        return x;
    }
}

9、剪格子

解法:DFS

package fourSession;

import java.util.Scanner;

/***  2013第四届省赛  9、剪格子 ***/
public class test9 {
    static int m, n;
    static int[][] g;
    static int avg;
    static int ans;
    static int[] dirs = {-1, 0, 1, 0, -1};

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        n = sc.nextInt();
        m = sc.nextInt();
        g = new int[m][n];
        int sum = 0;
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                g[i][j] = sc.nextInt();
                sum += g[i][j];
            }
        }
        sc.close();

        boolean[][] mark = new boolean[m][n];
        if (sum % 2 != 0) {
            System.out.println(0);
        } else {
            avg = sum / 2;
            ans = m * n;
            mark[0][0] = true;
            dfs(mark, 0, 0, sum - g[0][0], 1);
            ans = (ans == m * n ? 0 : ans);
            System.out.println(ans);
        }

    }

    private static void dfs(boolean[][] mark, int x, int y, int sum, int cnt) {
        if (sum < avg) return;
        if (sum == avg) {
            ans = Math.min(ans, cnt);
            return;
        }
        for (int i = 0; i < 4; i++) {
            int newX = x + dirs[i], newY = y + dirs[i + 1];
            if (newX >= 0 && newX < m && newY >= 0 && newY < n && !mark[newX][newY]) {
                mark[newX][newY] = true;
                dfs(mark, newX, newY, sum - g[newX][newY], cnt + 1);
                mark[newX][newY] = false;
            }
        }

    }
}

10、大臣的旅费

解法:树的直径/树形DP

package fourSession;

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

/***  2013第四届省赛  10、大臣的旅费 ***/
public class test10 {
    static int n;
    static HashMap<Integer, ArrayList<int[]>> g;
    static int ans = -1;
    static int leaf = 0;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        n = sc.nextInt();
        g = new HashMap();
        for (int i = 1; i < n; i++) {
            int from = sc.nextInt();
            int to = sc.nextInt();
            int weight = sc.nextInt();
            if (!g.containsKey(from)) g.put(from, new ArrayList<int[]>());
            if (!g.containsKey(to)) g.put(to, new ArrayList<int[]>());
            g.get(from).add(new int[]{to, weight});
            g.get(to).add(new int[]{from, weight});
        }

        dfs(1, 1, 0);
        dfs(leaf, leaf, 0);
        System.out.println(dis2money(ans));
    }

    private static void dfs(int v, int pre, int dis) {
        boolean isLeaf = true;
        for (int[] p : g.get(v)) {
            if (p[0] == pre) continue;
            isLeaf = false;
            dfs(p[0], v, dis + p[1]);
        }
        if (isLeaf && dis > ans) {
            ans = dis;
            leaf = v;
        }
    }

    private static int dis2money(int dis) {
        return 11 * dis + dis * (dis - 1) / 2;
    }

}

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

在这里插入图片描述

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

【蓝桥日记⑥】2013第四届省赛(软件类)JavaA组@答案解析 的相关文章

  • 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
  • java算法1——河内之塔

    河内之塔游戏规则 xff1a 有A B C三个石棒 xff0c A上有若干个从小到大依次排列的盘子 xff0c 盘子的数量为n xff0c 现在要求 xff0c 将A棒上的盘子依次移动到C棒上 xff0c 并且移动过程中要保证小盘在大盘之上
  • ubuntu搭建内部deb源

    搭建内部deb源 1 在根目录 xff08 home xff09 下创建debs文件夹 xff0c 把deb包都放到debs目录中 2 在根目录下执行如下命令 xff1a dpkg scanpackages debs dev null gz

随机推荐