可以放可以不放
采取二进制思想
用2的0,2的1,2的2,2的3,…,2的n-1次方这样的砝码可以最大化可称量区间【1~2的n次方-1的重量】
#include<bits/stdc++.h>
using namespace std;
int x;
signed main(){
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>x;
int ans=0;
while(x){
x/=2;
ans++;
}
cout<<ans;
}
可以放左边放右边不放
采取三进制思想
用3的0,3的1,3的2,3的3,…,3的n-1次方这样的砝码可以最大化可称量区间【1~3的n次方/2 -1的重量】
比如要称量的砝码重量是331=(110021)3 <==>(110101)3 -(000010)3
如果题目要输出方案的话,那么就是左边放243,81,9,1的砝码
右边放3的砝码,这样就能把331称出来了
#include<bits/stdc++.h>
using namespace std;
map<int,int>mp;
int x;
int cal(int x){
x=x*2+1;
int ans=0;
if(mp.count(x))ans--;//如果ans是3的幂次就--
while(x){
x/=3;
ans++;
}
return ans;
}
signed main(){
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
int i=1;
mp[1]=1;
while(i<=1e9)i*=3,mp[i]=1;
for(int i=1;i<=41;i++){
//第i个数 第i个数对应的数 第i个数的答案
cout<<i<<" "<<2*i+1<<" "<<cal(i)<<'\n';
}
}
跑一遍就知道了