第一题:数位倍数

代码:
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 个不同的人物。
小说的每一章都有以下三种情节的一种:
- A 发现 B 不知道真相。
- A 发现 B 知道真相。
- A 知道了真相。
为了保证读者的协调和新鲜感,小蓝的小说还要满足以下要求:
- "B 发现 A 不知道真相"不能在 "A 知道了真相"后。
- "B 发现 A 知道真相"不能在 "A 知道了真相"前。
- "B 发现 A 不知道真相"不能在 "B 发现 A 知道真相"后。
- 相邻的两章情节类型不同,例如如果第一章是 A 发现 B 不知道真相那么第二章就不能是 C 发现 D 不知道真相。
- 完全相同的情节不能出现两次。
现在小蓝希望知道,他最多能写多少章。
输入格式
输入的第一行包含一个正整数 nn,表示小说人数。
输出格式
输出一行包含一个整数表示答案,即小蓝最多能写多少章小说。
样例输入 1
2
样例输出 1
6
样例输入 2
3
样例输出 2
13
样例说明 1
以下是一种可能的情况:
- B 发现 A 不知道真相。
- A 知道了真相。
- B 发现 A 知道真相。
- A 发现 B 不知道真相。
- B 知道了真相。
- 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);
}
}