T1:奇怪的银行
可以直接把 当做物品大小,跑一遍完全背包。时间复杂度为
记 dp[i][j]
表示前 种面值恰好凑出 元的最少张数
转移:
代码实现
#include <bits/stdc++.h> #define rep(i, n) for (int i = 0; i < (n); ++i) using namespace std; inline void chmin(int& x, int y) { if (x > y) x = y; } int main() { int m; cin >> m; vector<int> w(1, 1); for (int i = 6; i <= m; i *= 6) w.push_back(i); for (int i = 9; i <= m; i *= 9) w.push_back(i); int n = w.size(); const int INF = 1001001001; vector<int> dp(m+1, INF); dp[0] = 0; rep(i, n) { for (int j = w[i]; j <= m; ++j) { chmin(dp[j], dp[j-w[i]]+1); } } cout << dp[m] << '\n'; return 0; }
T2:用户名已被使用
本题难度较大,首先枚举 个字符串的全排列,然后枚举这些字符串之间下划线的个数。
假设 和 之间有 个下划线,那么
枚举出全排列之后,写一个 枚举每个 的值,拼出用户名,然后判断是否已被占用,并将没被占用的用户名存入答案数组。最后将答案数组排序后输出。所有可能的用户名最多可能有 ,当 时,这个值取到最大值 。答案数组的大小要比这个数大。
代码实现
#include <bits/stdc++.h> #define rep(i, n) for (int i = 0; i < (n); ++i) using namespace std; int main() { int n, m; cin >> n >> m; vector<string> S(n); int len = 0; rep(i, n) { cin >> S[i]; len += S[i].size(); } sort(S.begin(), S.end()); set<string> ts; rep(i, m) { string t; cin >> t; ts.insert(t); } vector<string> ans; // cnt 表示已经用了多少个_ auto dfs = [&](auto f, int step, int cnt, string name) -> void { if (step == n-1) { name += S.back(); if (name.size() >= 3 and name.size() <= 15 and !ts.count(name)) { ts.insert(name); ans.push_back(name); } return; } for (int i = 15-len-cnt; i >= 1; --i) { string ul(i, '_'); f(f, step+1, cnt+i, name+S[step]+ul); } }; do { dfs(dfs, 0, 0, ""); } while (next_permutation(S.begin(), S.end())); sort(ans.begin(), ans.end()); if (!ans.size()) { puts("-1"); return 0; } for (string s : ans) cout << s << '\n'; return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现