标签:https 平衡 ems http div return .net pre poj
题目大意:给你一个天平,和一些砝码,只是这些砝码有点特殊,它的重量是1,3,9,27,……3^n。让你把一些砝码和一个给定的重量的物体放在左边,另一些砝码放在右边,使天平平衡(每个砝码最多用一个)
思路(平衡三进制):比如我们假设这个物体的重量是20,那么我们可以这样做。首先我们把20(十进制)转化为三进制(202),然后我们按照一定的规则,把这些数转化成0,1,-1表示。从低位到高位,我们这样来转化。当我们遇到一个2的时候,那么下一位加1,同时2变成-1。当我们遇到3的时候,那么下一位加1,同时3变成0,。然而当我们遇到1或0的时候我们不变也不进位。所以202就变成了1(-1)1(-1),这样20=(-1)*3^0+1*3^1+(-1)*3^2+1*3^3;这是一个很好的等式,所以我们把-1的项移到左边,剩下的在右边,就变成了20+1*3^0+1*3^2=1*3^1+1*3^3;这样放在天平的两端不就平衡了吗?20+1+9=3+27。
代码:
#include <iostream> #include <cstring> #include <cstdio> using namespace std; int a[100],i,n,T; int qpow(int a,int b) { int s=1; while(b>0) { if(b%2==1) { s=s*a; } a=a*a; b>>=1; } return s; } int main() { cin>>T; while(T--) { cin>>n; int ni=n; memset(a,0,sizeof(a)); for(i=0;ni;i++) { a[i]=ni%3; ni=(ni-a[i])/3; } for(int j=0;j<i;j++) { if(a[j]==3)//我们遇到3的时候,那么下一位加1,同时3变成0 { a[j]==0; a[j+1]++; } if(a[j]==2)//当我们遇到一个2的时候,那么下一位加1,同时2变成-1 { a[j+1]++; a[j]=-1; } } int flag1=0,flag2=0; for(int j=0;j<=i;j++) { if(a[j]==-1) { if(flag1) printf(","); flag1=1; cout<<qpow(3,j); } } if(flag1==0) cout<<"empty"; cout<<" "; for(int j=0;j<=i;j++) { if(a[j]==1) { if(flag2) printf(","); flag2=1; cout<<qpow(3,j); } } cout<<endl; } return 0; }
二进制和三进制的妙用:https://blog.csdn.net/qq_30339595/article/details/79410369
标签:https 平衡 ems http div return .net pre poj
原文地址:https://www.cnblogs.com/Fy1999/p/8995293.html