本题大意

用天平对一物品进行称重,现有重量不同的砝码,砝码的重量分别为:1,3,9,27,..,3^n。(n<20)

天平的右侧放砝码,左侧放物品或物品和砝码,使得左右两边的重量相等。

现有一个物品,计算左右两边应当分别放多少个多大的砝码才能使得天平平衡。

例如:现在有一个重量为21的物品,当左侧放物品和重量为9的砝码,右边放重量为27和3的砝码时,天平平衡。

Sample Input
4
2
3
21
250
Sample Output
left pan: 1
right pan: 3 left pan:
right pan: 3 left pan: 9
right pan: 27 3 left pan: 3
right pan: 243 9 1

解题思路:

1、首先计算3^i(0<=i<20),然后将计算结果保存至数组st[],数组add[i]=st[0]+st[1]+st[2]+..+st[i]。

2、创建两个数组,left[]保存左侧需要添加的砝码,right[]保存右侧需要删除得砝码。

3、获得大于物品重量的最小add[i]。这是右侧需要的最多得砝码数。

4、计算右侧砝码数与物品重量之差。并找出小于重量之差的最大砝码。

5、如果天平右侧已经没有上一步找出的最大砝码,则在天平的左侧添加此砝码,否则,删除天平右侧中上一步找出得最大砝码。

6、此时,如果天平平衡则退出,若不平衡,则将天平两端的重量之差减去上一步添加或删除的砝码。然后返回第4步。

具体代码如下:

#include <stdio.h>
#include <string.h>
#define MAX 1000000009
//st[i]=3^i, add[i]=st[0]+st[1]++st[i];
long st[20], add[20];
void init()
{
int i;
st[0] = 1;
add[0] = 1;
for(i=1; i<20; i++)
{
st[i] = st[i-1]*3;
add[i] = add[i-1]+st[i];
}
}
int find(int v) //在st数组中,找出小于V的最大数
{
int i;
for(i=0; i<20; i++)
if(v < st[i])
return i-1;
}
int main()
{
int n, i, hel, tmp, num, num1, num2;
long left[20],right[20];
long w;
init();
scanf("%d",&n);
while(n--)
{
memset(left,0,sizeof(left));
memset(right, 0, sizeof(right)); scanf("%ld",&w);
for(i=0; i<20; i++)
{
if(w < add[i])
break;
}
num = i;
num1=0; //左边砝码得个数
num2=i; //右边砝码得个数
hel = add[i]-w;
while(hel != 0) //hel==0时, 两端平衡
{
//if(hel == 1)
//break; tmp = find(hel); //找出小于hel的最大砝码
if(right[tmp] != 0) //右边已删除此砝码
{
left[tmp] = st[tmp];
hel = hel-left[tmp];
num1++;
}
else
{
right[tmp] = st[tmp];
hel = hel-right[tmp];
num2--;
}
}
// if(hel == 1 && right[0])
// if(hel != 0)
// {
// left[0] = hel;
// }
printf("left pan:");
for(i=num; i>=0; i--)
{
if(left[i] != 0)
printf(" %ld",left[i]);
}
printf("\nright pan:");
for(i=num; i>=0; i--)
{
if(right[i] == 0)
printf(" %ld",st[i]);
}
printf("\n\n");
}
return 0;
}

HNU 13073 Ternarian Weights 解题报告的更多相关文章

  1. CH Round #56 - 国庆节欢乐赛解题报告

    最近CH上的比赛很多,在此会全部写出解题报告,与大家交流一下解题方法与技巧. T1 魔幻森林 描述 Cortana来到了一片魔幻森林,这片森林可以被视作一个N*M的矩阵,矩阵中的每个位置上都长着一棵树 ...

  2. 二模13day1解题报告

    二模13day1解题报告 T1.发射站(station) N个发射站,每个发射站有高度hi,发射信号强度vi,每个发射站的信号只会被左和右第一个比他高的收到.现在求收到信号最强的发射站. 我用了时间复 ...

  3. BZOJ 1051 最受欢迎的牛 解题报告

    题目直接摆在这里! 1051: [HAOI2006]受欢迎的牛 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4438  Solved: 2353[S ...

  4. 习题:codevs 2822 爱在心中 解题报告

    这次的解题报告是有关tarjan算法的一道思维量比较大的题目(真的是原创文章,希望管理员不要再把文章移出首页). 这道题蒟蒻以前做过,但是今天由于要复习tarjan算法,于是就看到codevs分类强联 ...

  5. 习题:codevs 1035 火车停留解题报告

    本蒟蒻又来写解题报告了.这次的题目是codevs 1035 火车停留. 题目大意就是给m个火车的到达时间.停留时间和车载货物的价值,车站有n个车道,而火车停留一次车站就会从车载货物价值中获得1%的利润 ...

  6. 习题: codevs 2492 上帝造题的七分钟2 解题报告

    这道题是受到大犇MagHSK的启发我才得以想出来的,蒟蒻觉得自己的代码跟MagHSK大犇的代码完全比不上,所以这里蒟蒻就套用了MagHSK大犇的代码(大家可以关注下我的博客,友情链接就是大犇MagHS ...

  7. 习题:codevs 1519 过路费 解题报告

    今天拿了这道题目练练手,感觉自己代码能力又增强了不少: 我的思路跟别人可能不一样. 首先我们很容易就能看出,我们需要的边就是最小生成树算法kruskal算法求出来的边,其余的边都可以删掉,于是就有了这 ...

  8. NOIP2016提高组解题报告

    NOIP2016提高组解题报告 更正:NOIP day1 T2天天爱跑步 解题思路见代码. NOIP2016代码整合

  9. LeetCode 解题报告索引

    最近在准备找工作的算法题,刷刷LeetCode,以下是我的解题报告索引,每一题几乎都有详细的说明,供各位码农参考.根据我自己做的进度持续更新中......                        ...

随机推荐

  1. MQ日常维护操作手册

    假设队列管理器为QMgrName,以下所有使用QMgrName的地方您都可以替换成您维护的mq队列管理器名称. 一.MQ的启动与停止 用root用户启/停需要root用户包含在mqm组中. 1.MQ的 ...

  2. ubuntu下如何安装及使用 pysvn-workbench

    网上对于 pysvn-workbench 的教程几乎没有,没办法,只好去官网自学了,现在能正常上传资料了,写点东西,以免今后忘了 安装方面:在新立得中查找svn-workbench,subversio ...

  3. Spring+Struts集成(方案一)

    SSH框架是现在非常流行的框架之一,本文接下来主要来对Spring和Struts的集成进行展示. 集成原理:在Action中取得BeanFactory,通过BeanFactory取得业务逻辑对象. 集 ...

  4. android脚步---简单图片浏览器改变图像透明度

    图片浏览器调用ImageView的setAlpha方法来实现改变图片透明度. main.xml文件如下:三个按钮,两个imageview,,界面定义了两个ImageView,一个是显示局部图片的Ima ...

  5. '-[UIViewController _loadViewFromNibNamed:bundle:] loaded the "AttentionController" nib but the view outlet was not set.'

    问题出现原因: 先创建控制器的.h与.m文件,后来创建了相应的xib文件,运行后出现这个问题. 解决办法:

  6. QT中LineEdit、TextEdit 、PlainTextEdit 三个控件的区别

    QLineEdit是单行文本输入,一般用于用户名.密码等少量文本交互地方.QTextEdit用于多行文本,也可以显示HTML格式文本.QPlainTextEdit与QTextEdit很像,但它多用于需 ...

  7. CodeForces 139C Literature Lesson(模拟)

    这个题,读懂了就是水,读不懂就没办法下手,论英语阅读的重要性...只有五种形式,第一种万能型aaaa,是另外3种的特殊情况,第二种克莱里林四行打油诗aabb形式,第三种是交替的abab形式,第四种是封 ...

  8. CodeForces 591A Wizards' Duel

    水题 #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> us ...

  9. [iOS]C语言技术视频-17-指针变量高级用法练习二(使用堆内存完成链表结构的存储)

    下载地址: 链接: http://pan.baidu.com/s/1kTmwIYr 密码: j7xq

  10. 读书笔记——thinking in java

    1.一切都是对象,用引用操作对象 1.1程序存储的地方 引用存放在堆栈区(通用的RAM),所有对象存储在堆(一种通用的内存池).堆和堆栈的区别:堆栈中的这些引用,java系统是要知道确切的生命周期,堆 ...