首页 > 其他分享 >AtCoder Beginner Contest 336

AtCoder Beginner Contest 336

时间:2024-01-20 23:24:43浏览次数:35  
标签:AtCoder Beginner 10 int ll 336 long using define

AtCoder Beginner Contest 336

A - Long Loong

代码:

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<ll, ll>;
#define fi first
#define se second
using i128 = __int128_t;

void solve()
{
    int n;
    cin >> n;
    string s;
    for (int i = 1; i <= n; i++)
    {
        s += 'o';
    }
    cout << "L" + s + "ng" << endl;
}

int main()
{
    int t = 1;
    // cin >> t;
    while (t--)
    {
        solve();
    }
    return 0;
}

B - CTZ

代码:

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<ll, ll>;
#define fi first
#define se second
using i128 = __int128_t;

void solve()
{
    ll n;
    cin >> n;
    int cnt = 0;
    for (int i = 0; i < 63; i++)
    {
        if (n >> i & 1)
        {
            cout << cnt << endl;
            return;
        }
        cnt++;
    }
}

int main()
{
    int t = 1;
    // cin >> t;
    while (t--)
    {
        solve();
    }
    return 0;
}

C - Even Digits

解题思路:

进制转换,看作5进制。

代码:

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<ll, ll>;
#define fi first
#define se second
using i128 = __int128_t;

void solve()
{
    ll n;
    cin >> n;
    ll ans = 0;
    map<int, int> mp;
    mp[0] = 0;
    mp[1] = 2;
    mp[2] = 4;
    mp[3] = 6;
    mp[4] = 8;
    n--;
    while (n)
    {
        ans = ans * 10 + mp[n % 5];
        n /= 5;
    }
    ll res = 0;
    while (ans)
    {
        res = res * 10 + (ans % 10);
        ans /= 10;
    }
    cout << res << endl;
}

int main()
{
    int t = 1;
    // cin >> t;
    while (t--)
    {
        solve();
    }
    return 0;
}

D - Pyramid

解题思路:

枚举每个点作为中心点,往左能取的最长长度和往右能取的最长长度中的最小值就是该位置的上界。

总体取最大值。

代码:

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<ll, ll>;
#define fi first
#define se second
using i128 = __int128_t;

void solve()
{
    int n;
    cin >> n;
    vector<int> a(n + 1);
    for (int i = 1; i <= n; i++)
    {
        cin >> a[i];
    }
    vector<int> l(n + 10), r(n + 10);
    for (int i = 1; i <= n; i++)
    {
        l[i] = min(a[i], l[i - 1] + 1);
    }
    int ans = 0;
    for (int i = n; i; i--)
    {
        r[i] = min(a[i], r[i + 1] + 1);
        // cout << i << ' ' << l[i] << ' ' << r[i] << endl;
        ans = max(ans, min(l[i], r[i]));
    }
    cout << ans << endl;
}

int main()
{
    int t = 1;
    // cin >> t;
    while (t--)
    {
        solve();
    }
    return 0;
}

E - Digit Sum Divisible

解题思路:

数位\(dp\)。

最多有\(14\)个数位,每个数位\(9\)种非零值,数位和共有\(14 \times 9 = 126\)中情况。

枚举模上每种数位和的情况,如果数位和等于当前枚举数位和并且数字模上数位和为\(0\),那么就有一个答案。

\(f[i][j][k]:枚举到第i位时,数位总和为j时,当前数字mod上枚举的数位和为k时的答案数量。\)

代码:

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<ll, ll>;
#define fi first
#define se second
using i128 = __int128_t;
vector<int> h(20);
ll f[16][200][200];

ll dfs(int u, int s, int cur, bool lim, int k)
{
    if (u == 0)
    {
        return (s == k && cur == 0);
    }
    if (!lim && f[u][s][cur] != -1)
    {
        return f[u][s][cur];
    }
    ll res = 0;
    int up = lim ? h[u] : 9;
    for (int i = 0; i <= up; i++)
    {
        res += dfs(u - 1, s + i, (cur * 10 + i) % k, (lim && (i == up)), k);
    }
    if (!lim)
    {
        f[u][s][cur] = res;
    }
    return res;
}

void solve()
{

    ll n;
    cin >> n;
    int len = 0;
    while (n)
    {
        h[++len] = n % 10;
        n /= 10;
    }
    int s = 9 * 14;
    ll ans = 0;
    for (int i = 1; i <= s; i++)
    {
        memset(f, -1, sizeof f);
        ans += dfs(len, 0, 0, true, i);
    }
    cout << ans << endl;
}

int main()
{
    int t = 1;
    // cin >> t;
    while (t--)
    {
        solve();
    }
    return 0;
}

F - Rotation Puzzle

解题思路:

我们有四种旋转方法,那么就有四个转移方向。暴力枚举\(4^{20}\)。

我们发现,同一个操作连续进行两次,等于没有操作,所以\(4 \times3^{19}\)。

还是太大了,我们从前往后搜\(10\)步,再从后往前搜\(10\)步,\(2 \times 4 \times 3^{10} = 472392\)。

所以,双向宽搜。

代码:

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<ll, ll>;
#define fi first
#define se second
using i128 = __int128_t;

struct node
{
    vector<vector<int>> a;
    int d = 0;
    int op;
};

void solve()
{
    int n, m;
    cin >> n >> m;
    vector<vector<int>> g(n + 1, vector<int>(m + 1)), f(n + 1, vector<int>(m + 1));
    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= m; j++)
        {
            cin >> g[i][j];
            f[i][j] = (i - 1) * m + j;
        }
    }
    auto deal = [&](vector<vector<int>> a, int x, int y)
    {
        vector<vector<int>> b;
        b = a;
        for (int i = 1; i <= n - 1; i++)
        {
            for (int j = 1; j <= m - 1; j++)
            {
                b[i + x][j + y] = a[n - i + x][m - j + y];
            }
        }
        return b;
    };
    queue<node> q;
    map<vector<vector<int>>, int> vis;
    q.push({g, 0, -1});
    vis[g] = 0;
    while (q.size())
    {
        auto t = q.front();
        q.pop();
        // 从0走到10就是10步了
        if (t.d == 10)
        {
            continue;
        }
        for (int i = 0; i < 4; i++)
        {
            if (i == t.op)
            {
                continue;
            }
            // 传入的是初始矩阵和x,y轴的左上角偏移量
            auto v = deal(t.a, (i / 2), (i % 2));
            if (vis.find(v) == vis.end())
            {
                vis[v] = t.d + 1;
                q.push({v, t.d + 1, i});
            }
        }
    }
    queue<node> s;
    s.push({f, 0, -1});
    while (s.size())
    {
        auto t = s.front();
        s.pop();
        if (vis.find(t.a) != vis.end())
        {
            cout << t.d + vis[t.a] << endl;
            return;
        }
        if (t.d == 10)
        {
            continue;
        }
        for (int i = 0; i < 4; i++)
        {
            if (i == t.op)
            {
                continue;
            }
            auto v = deal(t.a, i / 2, i % 2);
            // 这里直接加入
            // 如果这里向上面一样判断,那么10步以上的答案都直接被过滤掉
            s.push({v, t.d + 1, i});
        }
    }
    puts("-1");
}

int main()
{
    int t = 1;
    // cin >> t;
    while (t--)
    {
        solve();
    }
    return 0;
}

标签:AtCoder,Beginner,10,int,ll,336,long,using,define
From: https://www.cnblogs.com/value0/p/17977318

相关文章

  • 比赛必备——codeforces better 和 atcoder better 的安装教程
    大家有没有像我一样英语不太好然后又想要打cf和atc的呢?(可能全世界就我英语不好)这里有两个强力的工具可以帮助我们解决这一问题——codeforcesbetter和atcoderbetter。由于我只用的是edge,所以下面默认为edge浏览器篡改猴首先我们需要安装篡改猴,link。codeforcesbe......
  • AtCoder Beginner Contest 337
    AtCoderBeginnerContest337做题顺序有点奇怪。先做的C。套路题。令\(to_i\)表示\(i\)的下一个点是什么。2min过了。再做的B。智障题。令\(now\)表示现在在哪个字符(A或B或C),然后挨个字符跳。结果真成智障了,第一发没判断A跳到C的情况,罚时+1。又做的A。入......
  • AtCoder Grand Contest 010 E Rearranging
    洛谷传送门AtCoder传送门赛时在想一些奇怪的东西,没想到建图。考虑使用元素两两之间的相对顺序来描述序列。发现若\(x,y\)互质那么它们的相对顺序被确定了。先把输入的序列从小到大排序。然后考虑互质的数之间先连一条无向边。那么先手要把无向边定向使得它是个DAG,后手会......
  • AtCoder Beginner Contest 337
    A-Scoreboard思路&&Code/*高桥和青木N场比赛xy得分情况分别为x1y1.....xnyn计算高桥的总得分与青木的总得分进行比较高桥得分>青木得分输出Takahashi==输出Draw<输出Aoki*......
  • AtCoder Beginner Contest 336
    AtCoderBeginnerContest33657秒切A,75秒切B。然后C就卡了,没想到五进制,二分答案加数位DP判断过了。用了半个小时。DE读完题,发现D可做。小推了一下发现可以维护线段树。很快写完过了样例。第一发罚时,\(+1\)和\(-1\)写反了。第二发罚时,把那个“金字塔”写成了......
  • 昆虫科学院 AtCoder Race Ranking 2023 Autumn
    概况为提高选手们的训练/比赛热情,我们(昆虫科学院)通过商讨,在\(2023-5-25\)仿照AtCoderRaceRanking(WTF)机制,设立了“昆虫科学院AtCoderRaceRanking2023”。该排行榜为\(2023\sim2024\)赛季的第二轮排行。校内参赛选手(按照学号排序)AtCoder用户名学号......
  • AtCoder Beginner Contest 335
    A-2023(abc335A)题目大意给定一个字符串,将最后一位改成4。解题思路模拟即可。神奇的代码#include<bits/stdc++.h>usingnamespacestd;usingLL=longlong;intmain(void){ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);strings;......
  • CodeForces & AtCoder rating 规则简述
    译者:rui_er,转载请注明出处。(备份自2020年11月2日的同名博客)本博客为了方便自己查阅,同时也方便大家了解,但因为我英语很菜,所以难免有翻译错的地方,还请评论区纠正。未注明资料来源的均为常识积累。1CodeForcesrating规则1.1CodeForcesrating与名字颜色换算设\(r\)......
  • AtCoder ABC 273 复盘
    AARecursiveFunction模拟,递归、递推、累乘都可以。我用的累乘。ACCodeBBrokenRounding也是模拟,每次将\(X\leftarrowX\div10^{i-1}\)后判断\(X\bmod10\)是否\(\geq5\),若是,\(X\leftarrowX+10\);若不是,不进行操作。最后再将\(X\div10\)输出。ACCodeC(K+1)-......
  • AtCoder ABC 270 复盘
    A1-2-4TestACCodeBHammerACCodeCSimplepathACCodeDStones完全背包的应用。ACCodeEAppleBasketsonCircle有一点数学,又有一点贪心,还有二分。首先将每个篮子取走\(\min_{1\leqi\leqn}(A_i)\)个苹果,然后再不断扫描数组,按照题意取走苹果。ACCode......