牛老板(记忆化搜索&贪心)
Posted Harris-H
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了牛老板(记忆化搜索&贪心)相关的知识,希望对你有一定的参考价值。
牛老板(记忆化搜索&贪心)
贪心,考虑优先选较大的。因为满足倍数关系,但需要考虑是否整除。
所以每次选较大的和次大的。
// Problem: 牛老板
// Contest: NowCoder
// URL: https://ac.nowcoder.com/acm/contest/11177/C
// Memory Limit: 524288 MB
// Time Limit: 4000 ms
// Date: 2021-08-22 20:57:50
// --------by Herio--------
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int N=1e3+5,M=2e4+5,inf=0x3f3f3f3f,mod=1e9+7;
#define mst(a,b) memset(a,b,sizeof a)
#define PII pair<int,int>
#define fi first
#define se second
#define pb emplace_back
#define SZ(a) (int)a.size()
#define ios ios::sync_with_stdio(false),cin.tie(0)
void Print(int *a,int n){
for(int i=1;i<n;i++)
printf("%d ",a[i]);
printf("%d\\n",a[n]);
}
#define all(x) x.begin(),x.end()
vector<ll>v6,v9;
int t;
unordered_map<ll,int>f;
int dfs(ll n){
if(n<6) return n;
if(f[n]) return f[n];f[n]=inf;
int p=upper_bound(all(v6),n)-v6.begin()-1;
if(p>=0) f[n]=min(f[n],dfs(n-v6[p])+1);
p=upper_bound(all(v9),n)-v9.begin()-1;
if(p>=0) f[n]=min(f[n],dfs(n-v9[p])+1);
p--;
if(p>=0) f[n]=min(f[n],dfs(n-v9[p])+1);
return f[n];
}
int main(){
ll mx=1e12;
for(ll i=6;i<=mx;i*=6) v6.pb(i);
for(ll i=9;i<=mx;i*=9) v9.pb(i);
scanf("%d",&t);while(t--){
ll n;scanf("%lld",&n);
printf("%lld\\n",dfs(n));
}
return 0;
}
以上是关于牛老板(记忆化搜索&贪心)的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Round #536 E. Lunar New Year and Red Envelopes /// 贪心 记忆化搜索 multiset取最大项