Vijos 1599 - 货币
来源:互联网 发布:网络暴力 维基百科 编辑:程序博客网 时间:2024/05/29 07:36
描述
在某个神秘的星球上有一种货币,它有一种奇怪的兑换规则
你有且仅有一枚面值为n的金币,你可以去银行进行兑换,也可以不兑换
如果去银行兑换,兑换的规则是这样的:用面值为a的金币去兑换可以换到a/2,a/3,a/4这三枚硬币(如果
是小数则截尾取整),你可以兑换多次
读入n
输出你最后最多能拥有的钱数w
每个测试点中有T组数据
格式
输入格式
一个数T表示该点的测试数据组数(1=<T<=20 )
下面跟着T行,每行一个整数n(0 <= n <= 1000000000 )
输出格式
输出T行(一一对应)
每行一个整数就是你最后最多拥有的钱数w
样例
样例输入
2122
样例输出
132
限制
各个测试点3s
提示
小心数据较大,但是不需要高精度
要使用记忆化,即用一个数组把曾经计算过的结果存储在里面。
超时了好几次,原来一直用DFS搜,没用记忆化。用了记忆化之后又内存超限,数组缩小到了一个可以过的范围。
#include <cstdio>long long ans;long long money;long long result[50000005] = {0};long long DFS(long long num);inline long long maxn(long long a, long long b){ return a > b ? a : b;}int main(){ int T; scanf("%d", &T); while (T--) { scanf("%lld", &money); ans = money; if (money > 3) { ans = maxn(money, DFS(money/2) + DFS(money/3) + DFS(money/4)); } printf("%lld\n", ans); } return 0;}long long DFS(long long num){ if (num <= 3) return num; else if (num <= 50000000 && result[num] > 0) return result[num]; else if (num <= 50000000) return result[num] = maxn(num, DFS(num/2) + DFS(num/3) + DFS(num/4)); else return maxn(num, DFS(num/2) + DFS(num/3) + DFS(num/4));}
感觉数组还能再大一点...
0 0
- Vijos 1599 - 货币
- [记忆化搜索]vijos 1599 货币
- [vijos 1599]: 货币(记忆化搜索+hash优化)
- vijos-p1599 货币 -记忆化搜索
- 货币
- 计价货币 结算货币
- vijos 1070
- vijos 1020
- VIJOS 1180
- VIJOS-P1130
- vijos-1788
- vijos-1385
- VIJOS-P1312
- Vijos 1059
- Vijos 1061
- vijos P1071
- VIJOS-P1033
- vijos 中青局
- 组合数性质
- PHP使用APC的主要用处(个人观点)
- 左偏树
- 使用qt开发ros应用
- * **ACM集训day11
- Vijos 1599 - 货币
- 二维数组作为函数参数---- error c2087:missing subscript
- Spark源码解析(二)
- hibernate与mysql映射类型对应表与mysql导入导出
- u盘在linux系统下文件只读方式的解决方案,linux基本常用命令之二十八dosfsck
- nodejs--path
- Maximum Subarray
- Android 开发神器系列(工具篇)之 Android WiFi ADB
- Android 中的 Service 全面总结