题目
你有一架天平。现在你要设计一套砝码,使得利用这些砝码可以称出任意 小于等于 N 的正整数重量。
那么这套砝码最少需要包含多少个砝码?
注意砝码可以放在天平两边。
样例输入
7
样例输出
3
评测用例规模与约定
对于所有评测用例,1 ≤ N ≤ 1000000000
运行限制
最大运行时间:1s
最大运行内存: 512M
题解
代码
找规律1
#include <iostream>
using namespace std;
int main () {
int ans = 1, x = 1, t = 1, n; // t表示能称出的上限,x表示最大砝码重量,ans表示个数,n表示最少要称出的重量
cin >> n;
while (t < n) {
x = 2 * t + 1; // t - x >= x + 1 => t = 2 * x + 1
t += x; // 上限再加 x
ans ++;
}
cout << ans << endl;
return 0;
}
找规律2
#include <iostream>
using namespace std;
int main () {
int ans = 0, x = 1, n;
cin >> n;
while (n > 0)
n -= x,
x *= 3,
ans ++;
cout << ans << endl;
return 0;
}
转换为平衡三进制
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+10;
vector <int> v;
int x, w = 3;
int main()
{
cin >> x;
// 转换为三进制数
while (x) {
v.push_back (x % w);
x /= w;
}
// 转换为平衡三进制数
int ans = v.size ();
for (int i = 0;i < v.size ();i ++)
if (v[i] == 0 || v[i] == 1) continue;
else if (v[i] == 2) v[i] = -1, i == v.size () - 1 ? ans ++ :v[i + 1] ++;
else if (v[i] == 3) v[i] = 0, i == v.size () - 1 ? ans ++ :v[i + 1] ++;
cout << ans << endl;
return 0;
}