蓝桥杯16届Java研究生组

第一题:数位倍数

代码:

复制代码
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        int count=0;
        for(int i=1;i<=202504;i++){
          int x=count_num(i);
          if(x%5==0){
            count++;
          }
        }
        System.out.println(count);
    }
    public static int count_num(int n){
      int num=0;
      while(n>0){
        num+=n%10;
        n=n/10;
      }
      return num;
    }
}
第三题:变换数组

问题描述

输入一个数组 aa ,包含有 nn 个元素 a1,a2,⋯,ana 1,a 2,⋯,a n 。对这个数组进行 mm 次变换,每次变换会将数组 aa 中的每个元素 aia i 转换为 ai⋅bitCount(ai)a i ⋅bitCount(a i )。其中 bitCount(x)bitCount(x ) 表示数字 xx 的二进制表示中 11 出现的次数,例如 bitCount(3)=2bitCount(3)=2,因为 33 的二进制表示为 1111,其中 11 出现了两次。

请输出变换之后的数组内容。

输入格式

输入的第一行包含一个正整数 nn ,表示数组 aa 中的元素个数。

第二行包含 nn 个整数 a1,a2,⋯,ana 1,a 2,⋯,a n,相邻整数之间使用一个空格分隔。

第三行包含一个整数 mm,表示变换次数。

输出格式

输出一行,包含 nn 个整数,相邻整数之间使用一个空格分隔,表示变换之后得到的数组 aa

样例输入

2

5 7

2

样例输出

20 63

样例说明

5=(101)25=(101)2,7=(111)27=(111)2,第一次变化后 a=[10,21]a=[10,21]。

10=(1010)210=(1010)2,21=(10101)221=(10101)2,第二次变换后 a=[20,63]a=[20,63]

代码:

复制代码
package LQ_16_jie;

import java.util.Scanner;

public class Test3 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[] arr = new int[n];
        for (int i = 0; i < n; i++) {
            arr[i] = sc.nextInt();
        }
        int m =sc.nextInt();
        for(int i=0;i<m;i++) {
            for (int j = 0; j < n; j++) {
                arr[j] = arr[j] * Integer.bitCount(arr[j]);
            }
        }
        sc.close();

        for(int i=0;i<n;i++) {
            System.out.print(arr[i]+" ");
        }

    }
}

第四题:最大数字

问题描述

我们有 nn 个连续的整数 1,2,3,⋯,n1,2,3,⋯,n,可以自由排列它们的顺序。

然后,我们把这些数字转换成二进制表示,按照排列顺序拼接形成一个新的二进制数。

我们的目标是让这个二进制数的值最大,并输出这个二进制对应的十进制表示。

输入格式

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

输出格式

输出一行包含一个整数表示答案。

样例输入

3

样例输出

30

代码:

复制代码
package LQ_16_jie;

import java.math.BigInteger;
import java.util.*;

/**
 * 蓝桥杯16届研究生省赛第四题-贪心算法
 */
public class Test4 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        solve(n);
    }

    public static void solve(int n){
        List<String> list =  new ArrayList<>();

        //生成二进制字符串列表
        for(int i=1;i<=n;i++){
            list.add(Integer.toBinaryString(i));
        }
        //排序,Lamda表达式
        list.sort((a,b)->(b+a).compareTo(a+b));

        StringBuilder sb = new StringBuilder();
        for(String s : list){
            sb.append(s);
        }

        //转十进制输出
        System.out.println(new BigInteger(sb.toString(),2));

    }
}

第五题:小说

问题描述

小蓝是一位网络小说家。现在他正在撰写一部新的推理小说,这部小说有 nn 个不同的人物。

小说的每一章都有以下三种情节的一种:

  1. A 发现 B 不知道真相。
  2. A 发现 B 知道真相。
  3. A 知道了真相。

为了保证读者的协调和新鲜感,小蓝的小说还要满足以下要求:

  1. "B 发现 A 不知道真相"不能在 "A 知道了真相"后。
  2. "B 发现 A 知道真相"不能在 "A 知道了真相"前。
  3. "B 发现 A 不知道真相"不能在 "B 发现 A 知道真相"后。
  4. 相邻的两章情节类型不同,例如如果第一章是 A 发现 B 不知道真相那么第二章就不能是 C 发现 D 不知道真相。
  5. 完全相同的情节不能出现两次。

现在小蓝希望知道,他最多能写多少章。

输入格式

输入的第一行包含一个正整数 nn,表示小说人数。

输出格式

输出一行包含一个整数表示答案,即小蓝最多能写多少章小说。

样例输入 1

2

样例输出 1

6

样例输入 2

3

样例输出 2

13

样例说明 1

以下是一种可能的情况:

  1. B 发现 A 不知道真相。
  2. A 知道了真相。
  3. B 发现 A 知道真相。
  4. A 发现 B 不知道真相。
  5. B 知道了真相。
  6. A 发现 B 知道真相。

小蓝一共能写 6 章。

评测用例规模与约定

对于 30% 的评测用例,n≤5≤5;

对于所有评测用例,1≤n≤1091≤n≤109。

代码:

复制代码
import java.util.Scanner;

public class Test5 {
    public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        long n=scanner.nextInt();
        if(n==1){
            System.out.println(1);
        }
        else{
            System.out.println(2*n*n-3*n+4);
        }
    }
}

第六题:01串

问题描述

给定一个由 0,1,2,3...0,1,2,3... 的二进制表示拼接而成的长度无限的 0101 串。其前若干位形如 011011100101110111...011011100101110111...。

请求出这个串的前 xx 位里有多少个 11。

输入格式

输入的第一行包含一个正整数 xx

输出格式

输出一行包含一个整数表示答案。

样例输入

7

样例输出

5

样例说明

给定的串的前 77 位为 01101110110111。

代码:

复制代码
package LQ_16_jie;

import java.util.Scanner;

public class Test6 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        long n = sc.nextLong();

        long count = 0;
        long pos = 0;
        long num = 0;
        while (pos < n) {
            String binary = Long.toBinaryString(num);
            long len = binary.length();

            for(int i = 0; i < len && pos + i < n; i++) {
                if(binary.charAt(i) == '1') {
                    count++;
                }
            }
            pos += len;
            num++;
        }

        System.out.println(count);
    }
}
相关推荐
贫民窟的勇敢爷们3 小时前
SpringBoot整合AOP切面编程实战,实现日志统一记录+接口权限校验
java·spring boot·spring
浅念-4 小时前
递归解题指南:LeetCode经典题全解析
数据结构·算法·leetcode·职场和发展·排序算法·深度优先·递归
Kiling_07044 小时前
Java集合进阶:Set与Collections详解
算法·哈希算法
AC赳赳老秦4 小时前
供应链专员提效:OpenClaw自动跟踪物流信息、更新库存数据,异常自动提醒
java·大数据·服务器·数据库·人工智能·自动化·openclaw
迈巴赫车主4 小时前
Java基础:list、set、map一遍过
java·开发语言
智者知已应修善业4 小时前
【51单片机89C51及74LS273、74LS244组成】2022-5-28
c++·经验分享·笔记·算法·51单片机
灵犀学长5 小时前
基于 Spring ThreadPoolTaskScheduler + CronTrigger 实现的动态定时任务调度系统
java·数据库·spring
洛水水5 小时前
【力扣100题】33.验证二叉搜索树
算法·leetcode·职场和发展
SimpleLearingAI5 小时前
聚类算法详解
算法·数据挖掘·聚类
刀法如飞6 小时前
Go 字符串查找的 20 种实现方式,用不同思路解决问题
算法·面试·程序员