- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
为了提高取款难度,某银行允许其客户在一次操作中只取下列金额之一:
1 日元(日本货币)
6日元,6^
2(=36)日元,6^
3(=216)日元,...
9日元,9^
2(=81)日元,9^
3(=729)日元,...
一共至少需要多少次操作才能取出N日元?
不允许将您提取的资金重新存入。
约束条件1≤N≤100000
N为整数。
输入以下列格式从标准输入中给出:
N输出如果至少需要 x 次操作才能取出总共 N 日元,则打印 x。
示例输入 1127示例输出 14个提取1日元、9日元、36(=6^
2)日元、81(=9^
2)日元,分四次操作可以提取127日元。
这对我来说似乎是一个简单的贪婪问题,所以这就是我使用的方法,但我看到其中一个样本得到了不同的结果并想通了,它不会总是贪婪的。
#include <iostream>
#include <queue>
#include <stack>
#include <algorithm>
#include <functional>
#include <cmath>
using namespace std;
int intlog(int base, long int x) {
return (int)(log(x) / log(base));
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
long int n;cin>>n;
int result=0;
while(n>0)
{
int base_9=intlog(9,n);int base_6=intlog(6,n);
int val;
val=max(pow(9,base_9),pow(6,base_6));
//cout<<pow(9,base_9)<<" "<<pow(6,base_6)<<"\n";
val=max(val,1);
if(n<=14 && n>=12)
val=6;
n-=val;
//cout<<n<<"\n";
result++;
}
cout<<result;
return 0;
}
在 n 14 和大于 12 时,我们必须选择 6 而不是 9,因为要达到零,需要的步数更少。
它只为 18/22 TC 提供 AC 请帮助我理解我的错误。
最佳答案
贪婪在这里不起作用,因为贪婪地选择答案,即每一步的最佳结果并不能保证最好的最终结果(你可以在你的例子中看到)。因此,您应该在每一步遍历所有可能的场景,以找出总体最优结果。
现在让我们看看我们如何做到这一点。如您所见,这里的最大输入可能是 10^
5。并且我们可以在一次操作中提取以下仅有的 12 个值中的任何一个 -
[1, 6, 9, 36(=6
^2), 81(=9
^2), 216(=6
>^3), 729(=9
^3), 1296(=6
^4), 6561(=9
^ 4), 7776(=6
^5), 46656(=6
^6), 59049(=9
^5)]
因为 6^
7 和 9^
6 会大于 100000。
因此,在每个值为 n
的步骤中,我们将尝试从上述数组中获取每个可能的(即小于或等于 n
)元素 arr[i] 和然后递归地解决 n-arr[i]
的子问题,直到我们达到零。
solve(n)
if n==0
return 1;
ans = n;
for(int i=0;i<arr.length;i++)
if (n>=arr[i])
ans = min(ans, 1+solve(n-arr[i]);
return ans;
现在这是非常耗时的递归解决方案(O(n*2^12)
)。我们将尝试优化它。当您尝试一些示例案例时,您会发现子问题是重叠的,这意味着可能存在重复的子问题。这就是动态规划的用武之地。您可以存储每个子问题的解决方案,以便我们将来可以重新使用它们。所以我们可以修改我们的解决方案如下
solve(n)
if n==0
return 1;
ans = n;
if(dp[n] is seen)
return dp[n];
for(int i=0;i<arr.length;i++)
if (n>=arr[i])
ans = min(ans, 1+solve(n-arr[i]);
return dp[n] = ans;
DP求解的时间复杂度是O(n*12)
;
关于algorithm - Strange Bank(Atcoder初学者竞赛099),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50784606/
我需要从许多不同的来源提取银行账户报表。我希望能够以某种标准化的方式获取这些数据,无论是 CSV、OFX 还是 XML 或其他格式。我只需要能够获得这些数据。我将使用我自己的帐户从中获取交易,因此那里
Closed. This question needs to be more focused。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过editing this post专注于一个问题
它上过新闻(1) (2) , 但没有技术解释,只是说这是芯片上的软件错误。 关于这是什么类型的错误,是否有任何进一步的信息?一次性错误、某些数字转换问题或...? 编辑:显然可以通过修改终端软件来规避
我们目前使用 NSoftware 的产品,它允许我们使用 OFX 协议(protocol)直接连接到银行以下载交易和余额。 OFX 在很多银行都可以使用,但我希望从使用其他银行连接方法的其他人那里获得
阅读维基百科上的“ARM 架构”,发现以下说法: Registers R0-R7 are the same across all CPU modes; they are never banked. R
构建文件:C:\ my \ work \ PigBank \ contrib \ piggybank \ java \ build.xml init: compile: [echo] **
为了提高取款难度,某银行允许其客户在一次操作中只取下列金额之一: 1 日元(日本货币) 6日元,6^2(=36)日元,6^3(=216)日元,... 9日元,9^2(=81)日元,9^3(=729)日
This是我指的问题。快速总结: 输入:一个整数时间T;银行关闭的时间(以分钟为单位)和一组 c 和 t 表示此人携带的现金数量(整数)和从现在开始的时间(以分钟为单位)如果没有送达,此人将离开。服务
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
我需要使用一些特定规则创建银行交易的模拟。例如,如果付款类型是使用借记卡完成,则必须收取 3.2% 的费用。 现在我还不能在 Controller 中设置规则。有人可以帮我吗? 这是我当前的 Cont
据我所知,共享内存被划分为存储体,并且多个线程对同一存储体内单个数据元素的访问将导致冲突(或广播)。 目前,我分配了一个相当大的数组,该数组在概念上表示两个矩阵的几对: __shared__ floa
我目前正在使用 OKL4 Hypervisor 同时运行 Android 和 RTOS,以在 Pandaboard (OMAP4430) 上对它们进行虚拟化。在加电期间的某个时刻,Linux 内核似乎
现在 SEPA 要求让人们习惯了 BIC 和 IBAN,有些遗留系统无法处理这些新数据。是否有可用于将 BIC 和 IBAN 转换回排序代码和帐户的算法或工具? 最佳答案 下面是一个例子: 从这里 w
我正在尝试使用 Revolut Open Banking API我无法弄清楚授权和身份验证流程是如何工作的。 什么是动态客户端注册?每次启动应用程序时都应该注册应用程序吗? 证书怎么样 - 它是如何工
我读了一些关于 CUDA 编程的教程。他们中的大多数人提到“如果半扭曲的所有线程访问相同的地址,则不存在存储体冲突(广播)”。我的问题是,部分相同的地址访问是否会导致CUDA共享内存中的存储体冲突?
我对 jquery 中的 contains 有疑问。好像只接受一个词。不是一个短语或两个词。 例子: $('#div:contains('Word')'); --> This is okay $('#
第一次发帖,这里的人似乎很有帮助。我目前正在编写我的第二个简单银行 atm/帐户作业。我的用户密码登录代码没有执行以下操作。 1。当在数组中找不到管脚时返回循环开始 2。如果 pin 不正确则使程序停
非常感谢您的帮助。 情况是我有这两个表: 表 1:借方。示例: date item value_debits 2012-08-01 item1 10 2012
我在点击银行 API 中工作。在该 API 中,我想显示该 API 的产品列表。我是点击银行 API 的初学者。 例如 $ch = curl_init(); curl_setopt($ch, CURL
这blog post解释内存库冲突如何破坏转置函数的性能。 现在我不禁想知道:“普通”cpu(在多线程上下文中)是否也会发生同样的情况?或者这是特定于 CUDA/OpenCL 的吗?或者它甚至没有出现
我是一名优秀的程序员,十分优秀!