变种三进制
常用来解决天平问题
代码三进制数转 ‘变种三进制数’ 分析
第十二届蓝桥杯 2021年省赛真题 (Java 大学B组) G最少砝码
#G 最少砝码
时间限制: 1.0s 内存限制: 512.0MB 本题总分:20 分
- 问题描述
你有一架天平。现在你要设计一套砝码,使得利用这些砝码可以称出任意小于等于 N 的正整数重量。
那么这套砝码最少需要包含多少个砝码?
注意砝码可以放在天平两边。
- 输入格式
输入包含一个正整数 N NN。
- 输出格式
输出一个整数代表答案。
求变种三进制数代码
//返回的是3进制的变种且 数组是翻转了的,便于计算(下标对应其指数)
public static List<Integer> changed3(int n){
if(n<=0){
return null;
}
//n的三进制
String str = Integer.toString(n, 3);
//翻转一下便于处理(下标对应其指数)
StringBuilder sb = new StringBuilder(str).reverse();
char[] chars = sb.toString().toCharArray();
List<Integer> list = new ArrayList<>();
for (int i = 0; i < chars.length; i++) {
if(chars[i]-'0' == 2){
list.add(-1);
if(i == chars.length-1){
list.add(1);
}else {
++chars[i+1];
}
}else if(chars[i] == '3'){
list.add(0);
if(i == chars.length){
list.add(1);
}else {
++chars[i+1];
}
}else {
list.add(chars[i]-'0');
}
}
return list;
}
代码结合上面的图来分析
题解
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
Set<Integer> set = new HashSet<>();
for (int i = 1; i <=n; i++) {
List<Integer> c3 = changed3(i);
for (int j=0;j<c3.size();++j) {
set.add((int) Math.abs(c3.get(j)*Math.pow(3,j)));
}
}
set.remove(0);//0 不能要
System.out.println(set.size());
测试结果