A - Pay to Win(记忆化搜索)
思路:将问题倒着考虑,从 到0. 显然每一步有4种方式。
但是对于 要满足 才行。所以这三种方式分别产生两种情况,
向上取整到达和向下取整到达。
即 .
因此可以进行 ,因为数据较大,所以应该采用 记忆化搜索,用 记录一下当前 的最小值。
时间复杂度: (状态数)
AC代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+5;
#define mst(a) memset(a,0,sizeof a)
ll a,b,c,d,n;
unordered_map<ll,ll>mp;
ll dfs(ll n){
if(!n) return 0;
if(n==1) return d;
if(mp[n]) return mp[n];
ll res=1e18;
if(n<res/d) res=n*d;
res=min(res,a+n%2*d+dfs(n/2));
res=min(res,a+(2-n%2)*d+dfs((n+1)/2));
res=min(res,b+n%3*d+dfs(n/3));
res=min(res,b+(3-n%3)*d+dfs((n+2)/3));
res=min(res,c+n%5*d+dfs(n/5));
res=min(res,c+(5-n%5)*d+dfs((n+4)/5));
mp[n]=res;
return res;
}
int main(){
int t;
scanf("%d",&t);
while(t--){
mp.clear();
scanf("%lld%lld%lld%lld%lld",&n,&a,&b,&c,&d);
printf("%lld\n",dfs(n));
}
return 0;
}