AtCoder Beginner Contest 044 题解
A - Tak and Hotels (ABC Edit)
题目大意:
有个酒店, 前 k 天每天的 a 元,后续每天 b 元,问住你 n 天要多少钱。
分析:
看到数据范围,便知道暴力和推公式都是可行的。这种题目怎么快怎么来,想得清楚就推公式,想不清楚就暴力。
int main (){
IOS
int n, k, x, y; cin >> n >> k >> x >> y;
if (n <= k){
cout << n * x << endl;
}
else {
cout << (k * x) + (n - k) * y << endl;
}
return 0;
}
B - Beautiful Strings
题目大意:
判断字符串里所有字母出现次数是不是偶数。照做呗。
int main (){
IOS
string s; cin >> s;
map <char, int> cnt;
for (int i = 0 ; i < s.size () ; i ++){
cnt[s[i]] ++;
}
for (auto i : cnt){
if (i.second % 2 != 0){
cout << "No" << endl;
return 0;
}
}
cout << "Yes" << endl;
return 0;
}
C - Tak and Cards
题目大意:
从给定数组中,选出任意个数,使得这些数的平均数为 k ,问有多少种选法 (会爆 int )
分析:
这场的题目从 C, D 两题就感觉比上一场难不少,(上一场 30 分钟不到写完了,让我开始怀疑 ABC 的训练价值)此题不难但是略微轻敌了,浪费
很经典的 DP 题,类似于 01 背包求方案数。对于平均数,常用的处理就是把所有数减去这个值。之后就正常 DP 即可,和为 0 的方案数 - 1 就是所求的答案。
为什么要 -1,因为一个数都不取的方案,也是记在 f[0] 里的,并非合法的方案数。
由于数据范围较小,状态表示中下标有负数的情况,本题用 map 来映射了,正常数据范围题目要注意复杂度。
#define int long long
int a[N];
signed main (){
IOS
map <int, int> cnt;
int n, k; cin >> n >> k;
cnt[0] = 1;
for (int i = 1 ; i <= n ; i ++){
cin >> a[i];
a[i] -= k;
map <int, int> copy(cnt);
for (auto &j : copy){
cnt[j.x + a[i]] += j.y;
}
}
cout << cnt[0] - 1<< endl;
return 0;
}
D - Digit Sum
题目大意:
给出 n与 s ,问是否存在 b 使得 s 是 n 在 b 进制下各位数字之和。如 87654 在 10 进制 下各位数字之和为 30.
分析:
此题想了好久没有思路,属于是数论菜鸡了。本以为可以二分,发现没有单调性,暴力枚举复杂度又不够,然后思路就断了。没想到居然是暴力枚举一段,再拿式子找一段。
按题意可得以下两个式子
由于 b 的范围较大,暴力枚举 b 进行 判断不现实。从上面的式子可以看出,b越大,项越少。然后可以看出在 时,只存在两项 ,所以我们可以枚举前 项,剩下的用公式分析如下:
两式相减可得,
接着只需要枚举 n - s 的合法性判断是否存在即可
注意合法性判断既要满足 x1,x2 大于 0,也要小于 b
#include<bits/stdc++.h>
#define int long long
#define INF 0x7f7f7f7f //2139062143
#define llINF 9223372036854775807
#define IOS ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#define Equ(a,b) (fabs((a)-(b))<eps)
#define More(a,b) (((a)-(b))>(eps))
#define x first
#define y second
using namespace std;
const int N=1e6+7;
const double eps=1e-6;
const int mod=1e9+7;
int a[N];
int n, s;
bool check (int t){
int nn = n, res = 0;
while (nn){
res += (nn % t);
nn /= t;
}
return res == s;
}
signed main (){
IOS
cin >> n >> s;
if (n == s){
cout << s + 1 << endl;
return 0;
}
if (n < s){
cout << -1 << endl;
return 0;
}
int ans = -1;
for (int i = 2 ; i <= n / i ; i ++){
if (check (i)){
ans = i;
break;
}
}
if (ans != -1){
cout << ans << endl;
return 0;
}
ans = 1e18;
int k = n - s;
for (int i = 1 ; i <= k / i ; i ++){
if (k % i == 0){
int bb = k / i + 1, x0 = s - i;
if (bb >= n / bb && x0 >= 0 && i < bb && x0 < bb && bb >= 2){
ans = min (bb, ans);
}
}
}
cout << (ans == 1e18 ? -1 : ans)<< endl;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探