牛老板(记忆化搜索&贪心)

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;
}

以上是关于牛老板(记忆化搜索&贪心)的主要内容,如果未能解决你的问题,请参考以下文章

leetcode213周赛

Codeforces Round #536 E. Lunar New Year and Red Envelopes /// 贪心 记忆化搜索 multiset取最大项

记忆化搜索,FatMouse and Cheese

Doing Homework---hdu1074(状态压缩&&记忆化搜索)

HDU 2089 不要62(数位dp&记忆化搜索)

bzoj 1415: [Noi2005]聪聪和可可 期望dp+记忆化搜索