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.

分析:

此题想了好久没有思路,属于是数论菜鸡了。本以为可以二分,发现没有单调性,暴力枚举复杂度又不够,然后思路就断了。没想到居然是暴力枚举一段,再拿式子找一段。

按题意可得以下两个式子

{x0+x1+x2+x3+...+xm=sx0b0+x1b1+x2b2+x3b3+...+xmbm=n

由于 b 的范围较大,暴力枚举 b 进行 判断不现实。从上面的式子可以看出,b越大,项越少。然后可以看出在 b2>=s时,只存在两项 x0x1 ,所以我们可以枚举前 s 项,剩下的用公式分析如下:

{x0+x1=sx0+x1b=n

两式相减可得,(b1)x1=ns

接着只需要枚举 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;
}
posted @   sweet_guagua  阅读(136)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
点击右上角即可分享
微信分享提示