题目描述

旅行完了的牛牛又胖了,于是他终于下决心要戒掉零食,所以他带着他最爱的土豆回到了牛星,开始了在牛星种土豆和只吃土豆减肥的日子。(吃土豆能减肥么?)经过了辛勤的劳作,牛牛种的土豆奇迹般的收获了,于是他得到了很多很多很多很多的土豆(实在太多,数不过来了,你可以认为是无穷个)。他将这很多很多个土豆按照重量从小到大进行了排序,每个土豆的编号依次为1、2、3……N,然后他就惊奇地发现:由于牛星球的土壤很奇特,第i个土豆的重量正好是3^i-1 。

现在牛牛饿了要吃掉其中的若干个土豆。他每次拿的土豆的数目是任意的,选的土豆也是任意的。选中的土豆的总重量即每个土豆重量之和。例如:牛牛这一次拿了第一个土豆和第三个土豆,那么总重量为1+9=10。

牛牛想知道,在所有的选土豆方案里,他可以获得的第k大的“总重量”是多少。

输入

有多组输入样例。
第一行是一个整数T,表示有T组测试样例,0 ≤ T ≤ 70。
之后的T行中,每一行有一个数字k。(k<=2^31 - 1)

输出

针对每一个测试样例,输出一行;格式为:
“Case #Num: A”,其中,N表示第Num组样例,A表示他可以获得的第k大的总重量。

限制

时间限制: 1.000 Sec 内存限制: 128 MB

样例

样例输入

2
7
4

样例输出

Case #1: 13
Case #2: 9

解题思路

我自己都想不到这篇题解我居然写的这么详细

纯纯的一道思维题

思路就是 找规律

首先分析一下题意:

土豆的重量依次为:1,3,9,27,81……
牛牛能够拿到的总重量从小到大为:
1、3、4(=1+3)、9、10(=1+9)、12(=9+3)、13(=1+9+3)……
所以第7大的总重量是13,第4大的总重量是9

写出几组数据,即

因此,我们可以发现:

第k大的总重量是3的不同次方累计的结果

再继续分析,k为1时,总重量为3的0次方;k为2时,总重量为3的1次方;k为3时,总重量为3的0次方加上3的1次方;k为4时,总重量为3的2次方…

“总重量”与“多少次方”的关系是不是像极了3进制转换成10进制?

1等于2的0次方,2等于2的1次方,3等于2的1次方加上2的0次方…以此类推

“k”与“多少次方”的关系是不是像极了2进制转换成10进制?

所以,这个题的规律就出来了:将k转换成2进制,把这个2进制当成3进制,再转换成10进制。

如下图所示:

知道规律后就可以写代码啦

你以为这就结束了吗?

还有一点需要注意,k的范围是 k<=2^31 - 1,故用int数据会溢出,应该用long long int来存储总重量

而且,需要在十进制转换成二进制的过程中直接进行三进制转十进制的操作,如下:

long long int w = 0, times = 1;  // w直接为最终的结果while (k) {w += (k % 2) * times; times *= 3; k /= 2;
}

而不是先将十进制转换为二进制,再将结果当成三进制转换成十进制,如下:

long long int w1 = 0,w2 = 0, times1 = 1,times2;
// w1为十进制转换成二进制的结果,w2为将w1看成三进制后转换为十进制的结果while (k) {w1 += (k % 2) * times1; times1 *= 10; k /= 2;
}
while (w1) {w2 += (w1 % 10) * times2; times2 *= 3; w1 /= 10;
}

第二种方法由于需要用变量存储二进制数,而2^31 - 1转换成二进制数的位数是非常大的,超过了unsigned long long int 的范围,故会导致出错 (除非用高精度)

AC代码

#include<iostream>using namespace std;int main() {int t, k;cin >> t;for (int i = 1; i <= t; i++) {scanf("%d", &k);long long int w = 0, times = 1; // w指总重量,times指倍数(即3^0,3^1,3^2......)  * 注意用long long int 防止数据溢出 *// 进制转换,直接将二进制的每一位当成三进制,然后转换成十进制while (k) {w += (k % 2) * times; times *= 3; k /= 2;}printf("Case #%d: %lld\n", i, w); // 打印结果,注意long long int 需要用%lld}return 0;
}

题解 - 只能吃土豆的牛牛(C++)相关推荐

  1. 所有程序员会面临的问题:程序员只能吃青春饭?

    作者专注于Java.架构.Linux.小程序.爬虫.自动化等技术. 工作期间含泪整理出一些资料,微信搜索[程序员高手之路],回复 [java][黑客][爬虫][小程序][面试]等关键字免费获取资料. ...

  2. 软件测试这个岗位真的只能吃青春饭?

    上次我写的文章"35岁?程序员究竟能在IT行业干多久?"中就提到了35岁在IT行业还能继续坚持下去吗?文章给出的答案是:可以.那么现在回到软件测试这个岗位也是一样的道理.之所以想写 ...

  3. 老虎和一些食肉动物饿了就只能吃我们鸟儿了

    九个兄弟姐妹的快乐的翅膀 今天的九个兄弟姐妹的快乐的翅膀,还有一次,老虎和一些食肉动物饿了就只能吃我们鸟儿了,我们好奇地问道,我们跑过去一瞧,我的外婆是个性格开朗的人,这时张炎晨也说就是你,干什么呀, ...

  4. 如果火锅只能吃三样......

    欢迎关注天善智能,我们是专注于商业智能BI,人工智能AI,大数据分析与挖掘领域的垂直社区,学习,问答.求职一站式搞定! 对商业智能BI.大数据分析挖掘.机器学习,python,R等数据领域感兴趣的同学 ...

  5. 日本最惨数学天才!37岁裸辞,房子被政府没收,向全村人乞讨,一家五口只能吃野菜.........

    全世界只有3.14 % 的人关注了 爆炸吧知识 数学是火 他是飞蛾 多年以后,当冈熙哉站在桥本市的数学家纪念碑前,准会想起父亲请他吃面包片的那个遥远的夜晚. 当时,他们一家五口蜗居在邻居施舍租出的小库 ...

  6. 程序员只能吃青春饭?3条晋升之路帮你摆脱程序员中年魔咒!

    作为一个程序员 尤其是在这些中 不管是中国 还是美国的这些大的公司里边呢 往往呢 有大概两条这样的一个境界之路 根据你自己个人的这种能力兴趣 其实你可以进行自己的选择 科技大佬们其实往往呢也都是从 这 ...

  7. 2011中国编程者=走出程序员的悲哀=谁说中国程序员只能吃青春饭?

    首先我想说的是,如何选择编程语言,在做出选择前,我们要先了解各种语言的优缺点: 编译型的语言:         ASM:    汇编语言,几乎接近机器语言,优点执行效率高,是助记符的语言,难学也难理解 ...

  8. nyoj 234 吃土豆

    描述 Bean-eating is an interesting game, everyone owns an M*N matrix, which is filled with different q ...

  9. 程序员只能吃青春饭?老程序员爆料花样出路

    我们以前说的 "青春饭",一般都是服务行业或者娱乐行业,吃"脸蛋儿" 的职业. 而现在对 "青春饭" 的定义已经发生翻天覆地的变化,互联网经 ...

  10. 程序员只能吃“青春饭”?C 认证带你破局!

    2019 年搜狐科技<中国互联网简史>报告显示,国内近一半的程序员年龄在 25-29 岁之间,其次为 30-34岁,占比 24.6%,35 岁 -39 岁的程序员占比 6.1%,而 40岁 ...

最新文章

  1. Something needs to be forgotten.
  2. JAVA线程池的简单实现及优先级设置
  3. 重置linux桌面,Ubuntu 18.04小贴士:重置Gnome桌面与使用隐藏的屏幕录像工具
  4. CentOS 6.4安装pip,CentOS安装python包管理安装工具pip的方法
  5. 理解Storm Metrics
  6. keyvaluepair_KeyValuePair用法(转)
  7. kafka集群部署成功后,创建生产者往指定主题里面发送消息时出错
  8. dedecms织梦入门
  9. 小白入门,Shell脚本,编写脚本显示信息,编写脚本自动创建文件,编写脚本对数据进行双硬盘备份
  10. python传奇自动打怪脚本_大漠传奇自动打怪源码分享
  11. 数据结构与算法实验6——图论 7-9 哥尼斯堡的“七桥问题”
  12. 云原生|容器和应用安全运营实践思考
  13. 笔记本连不上苹果手机热点怎么回事
  14. Simulink自动代码生成:如何标准化的建模?以MAB,MISRA C 2012建模规范为例
  15. js控制form提交的action
  16. linux内核printk调试手段,linux内核printk调试
  17. ElasticSearch的搭建和报错处理
  18. vue3使用Pinia进行全局状态管理,Pinia安装和使用,Pinia 和 Vuex的对比
  19. 每月播报:2008年10月 动态语言
  20. 水洼数目(dfs万能模板)

热门文章

  1. ORCAD16.6禁止start page启动的两种方式
  2. 文件或目录损坏且无法读取的解决办法(集合)
  3. 计算机应用技术和it有什么区别,IT是程序员吗?IT究竟是什么意思?
  4. echarts南丁格尔玫瑰图
  5. 微信小程序框架介绍以及项目目录结构
  6. matlab 绘图 模板,【科研绘图】MATLAB可视化代码模板
  7. CSP多USBkey操作获取信息
  8. 前端福利!layui可视化布局
  9. adobe怎么统计字数_pdf文档统计字数的问题
  10. 微信支付/支付宝指纹支付原理