本文主要是介绍poj 1702(Eva's Balance),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目链接:点击打开链接
题目大意:有些3的幂的重量的砝码,现在给定任意一质量的重物,现在要求怎么样放置才能平衡
题目分析:将重物转化为三进制(0,1,2),先要分成3的幂,所以见2 就要想办法变为1,见1如果有前面的进位,那么也要进行进位。
最终得到的没有2的数则为右边的重量,左边的所需要的则是刚才调整时用到的重量
由于是自己做法,有点搓欢迎斧正
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
long long n;
int posi;
int tril[25];
int solve(int m)
{int i=1,flag=0,tmp;memset(tril,-1,sizeof(tril));while(m){tril[i++]=tmp=m%3;if(tmp==2) flag=1;m=m/3;}posi=i-1;if(!flag) return 1;return 0;
}
void digit(int k)
{long long ans=1;while(k--){ans*=3;}printf("%lld",ans);
}void solve2(){int i,left[25],right[25],c=0,tmp=0;memset(left,0,sizeof(left));for(i=1;i<=posi+1;i++){if(tril[i]==2&&c)tril[i]=0;else if(tril[i]==2){tril[i]=0;c=1;left[i]=1;}else if(tril[i]==1&&c){left[i]=1;tril[i]=0;}else if(tril[i]==-1 && c)tril[i]=1;else if(tril[i]!=-1){tril[i]+=c;c=0;}}int first=0;for(i=1;i<=posi+1;i++){if(left[i]==1){ if(!first) first=1;elseprintf(",");digit(i-1);}}first=0;printf(" ");for(i=1;i<=posi+1;i++){if(tril[i]==1){ if(!first) first=1;elseprintf(",");digit(i-1);}}printf("\n");
}
int main()
{int t,first;scanf("%d",&t);while(t--){scanf("%lld",&n);if(solve(n)){ first=0;printf("empty ");for(int i=0;i<=posi;i++){if(tril[i]==1){if(!first) first=1;elseprintf(",");digit(i-1);}}printf("\n");}elsesolve2();}return 0;
}
这篇关于poj 1702(Eva's Balance)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!