蓝桥杯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);
    }
}
相关推荐
东离与糖宝2 小时前
Spring AI 2.0+Gemma 4端侧部署:Java离线AI应用全教程
java·人工智能
6Hzlia2 小时前
【Hot 100 刷题计划】 LeetCode 76. 最小覆盖子串 | C++ 滑动窗口题解
c++·算法·leetcode
像素猎人2 小时前
蓝桥杯OJ2049蓝桥勇士【动态规划】【dp[n]不是符合题意的答案,只是以an结尾的子问题的答案】
c++·算法·蓝桥杯·动态规划·区间dp
羊小猪~~2 小时前
LLM--SFT简介
python·考研·算法·ai·大模型·llm·微调
0xDevNull2 小时前
Java BigDecimal 完全指南:从入门到精通
java·开发语言·后端
ch.ju2 小时前
Java程序设计(第3版)第二章——变量的三种定义方式1
java
XiYang-DING2 小时前
【Java】从源码深入理解LinkedList
java·开发语言
无心水2 小时前
17、Java内存溢出(OOM)避坑指南:三个典型案例深度解析
java·开发语言·后端·python·架构·java.time·java时间处理
冰暮流星2 小时前
javascript之Dom查询操作1
java·前端·javascript