首页 > 其他分享 >HHKB Programming Contest 2023(AtCoder Beginner Contest 327)

HHKB Programming Contest 2023(AtCoder Beginner Contest 327)

时间:2023-11-04 22:00:12浏览次数:36  
标签:AtCoder return Beginner Contest int ll long solve using

HHKB Programming Contest 2023(AtCoder Beginner Contest 327)

A. ab

解题思路:

模拟即可。

代码:

#include <bits/stdc++.h>
using namespace std;
using ll = long long;

void solve()
{
    int n;
    cin >> n;
    string s;
    cin >> s;
    for (int i = 0; i < n - 1; i++)
    {
        if (s[i] == 'a' && s[i + 1] == 'b')
        {
            puts("Yes");
            return;
        }
        if (s[i] == 'b' && s[i + 1] == 'a')
        {
            puts("Yes");
            return;
        }
    }
    puts("No");
}

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

B. A^A

解题思路:

\(a^a\),我们发现\(a\)到达\(18\)的时候就会超过\(10^{18}\)了(可能更早),暴力模拟即可。

代码:

#include <bits/stdc++.h>
using namespace std;
using ll = long long;

ll qmi(ll a, ll b)
{
    ll res = 1;
    while (b)
    {
        if (b & 1)
        {
            res = res * a;
        }
        a = a * a;
        b >>= 1;
    }
    return res;
}
void solve()
{
    ll b = 0;
    cin >> b;
    for (ll i = 1; i <= 20; i++)
    {
        if (qmi(i, i) == b)
        {
            cout << i << endl;
            return;
        }
    }
    cout << -1 << endl;
}

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

C. Number Place

解题思路:

按题意模拟即可。

代码:

#include <bits/stdc++.h>
using namespace std;
using ll = long long;

void solve()
{
    vector<vector<int>> g(12, vector<int>(12));
    for (int i = 1; i <= 9; i++)
    {
        for (int j = 1; j <= 9; j++)
        {
            cin >> g[i][j];
        }
    }

    for (int i = 1; i <= 9; i++)
    {
        set<int> s;
        for (int j = 1; j <= 9; j++)
        {
            if (!s.count(g[i][j]))
            {
                s.insert(g[i][j]);
            }
        }
        if (s.size() != 9)
        {
            // cout << i << endl;
            cout << "No" << endl;
            return;
        }
    }
    for (int i = 1; i <= 9; i++)
    {
        set<int> s;
        for (int j = 1; j <= 9; j++)
        {
            if (!s.count(g[j][i]))
            {
                s.insert(g[j][i]);
            }
        }
        if (s.size() != 9)
        {
            // cout << i << endl;
            cout << "No" << endl;
            return;
        }
    }
    int row = 0;
    int col = 0;
    for (int k = 0; k < 9; k++)
    {
        set<int> s;
        row = k / 3;
        col = k % 3;
        for (int i = 1; i <= 3; i++)
        {
            int x = row * 3 + i;
            for (int j = 1; j <= 3; j++)
            {
                int y = col * 3 + j;
                if (!s.count(g[x][y]))
                {
                    s.insert(g[x][y]);
                }
            }
        }

        if (s.size() != 9)
        {
            cout << "No" << endl;
            return;
        }
    }
    cout << "Yes" << endl;
}

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

D. Good Tuple Problem

解题思路:

扩展域并查集。

对于每个下标有\(0和1\)两个域.

举例:

若\(X_{A_i} \neq X_{B_i}\),那么一定有\(A_i\)的\(1\)域和\(B_i\)的\(0\)域合并,\(A_i\)的\(0\)域和\(B_i\)的\(1\)域合并。

遍历\(A,B\),合并所有\(01\)域,然后遍历判断所有下标,如果改下标\(01\)域在同一个集合中,那么不存在\(X\)。

代码:

#include <bits/stdc++.h>
using namespace std;
using ll = long long;

void solve()
{
    int n, m;
    cin >> n >> m;
    vector<int> a(m + 1), b(m + 1);
    for (int i = 1; i <= m; i++)
    {
        cin >> a[i];
    }
    for (int i = 1; i <= m; i++)
    {
        cin >> b[i];
    }
    vector<int> p(2 * n + 10);
    for (int i = 1; i <= 2 * n; i++)
    {
        p[i] = i;
    }

    auto find = [&](auto self, int x) -> int
    {
        if (x != p[x])
        {
            p[x] = self(self, p[x]);
        }
        return p[x];
    };
    auto merge = [&](int a, int b)
    {
        int pa = find(find, a);
        int pb = find(find, b);
        if (pa != pb)
        {
            p[pa] = pb;
        }
    };
    for (int i = 1; i <= m; i++)
    {
        merge(a[i], b[i] + n);
        merge(a[i] + n, b[i]);
    }
    for (int i = 1; i <= n; i++)
    {
        if (find(find, i) == find(find, i + n))
        {
            puts("No");
            return;
        }
    }
    puts("Yes");
}

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

E. Maximize Rating

解题思路:

\(f[i][j]:前i个竞赛中选取j个竞赛计算(\sum_{i= 1}^k(0.9)^{k-i}Q_i)的最大值\)。

\[f[i][j] = max(f[i-1][j-1]*0.9 + p[i],f[i-1][j]) \]

其中两个式子分别对应这第\(i\)个竞赛选或不选:

如果选,那么取的第\(j\)个竞赛就是\(p[i]\),其余\(j-1\)个竞赛就是从前\(i-1\)个竞赛中取的,\(f[i-1][j-1] \to f[i][j]\)。

如果不选,第\(j\)个竞赛就是从前\(i-1\)个竞赛中取的,\(f[i-1][j] \to f[i][j]\)。

最后,枚举选多少个竞赛,带入公式,取最大值即可。

代码:

#include <bits/stdc++.h>
using namespace std;
using ll = long long;

void solve()
{
    int n;
    cin >> n;
    vector<int> p(n + 1);
    for (int i = 1; i <= n; i++)
    {
        cin >> p[i];
    }
    vector<vector<double>> f(n + 1, vector<double>(n + 1));
    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= i; j++)
        {
            f[i][j] = max(f[i - 1][j - 1] * 0.9 + p[i], f[i - 1][j]);
        }
    }
    double ans = -1e18;
    for (int i = 1; i <= n; i++)
    {
        ans = max(f[n][i] / (10.0 * (1 - pow(0.9, i))) - (1200 / sqrt(i)), ans);
    }
    printf("%.15lf", ans);
}

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

标签:AtCoder,return,Beginner,Contest,int,ll,long,solve,using
From: https://www.cnblogs.com/value0/p/17809867.html

相关文章

  • AtCoder Beginner Contest 327
    A-ab(abc327A)题目大意给定一个字符串\(s\),问是否包含ab或ba。解题思路遍历判断即可。神奇的代码#include<bits/stdc++.h>usingnamespacestd;usingLL=longlong;intmain(void){ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);i......
  • Atcoder Grand Contest 016
    给我贺完了?A-Shrinking给定一个串\(s\),每次可以进行如下操作:记串长为\(n\).构造长为\(n-1\)的串\(s'\),满足\(s'_i\)为\(s_i\)或\(s_{i+1}\),令\(s\leftarrows'\).问使\(s\)中所有字符相同的最小操作次数。\(|s|\le100\).按照题意模拟即可,时间复杂度......
  • AtCoder Beginner Contest 326 (ABC326)
    A.2UP3DOWN直接模拟即可。CodeB.326-likeNumbers枚举,每次拆除百、十、个位,再判断。CodeC.PeakDescription数字线上放置了\(N\)个礼物。第\(i\)个礼物放置在坐标\(A_i\)处。可以在数轴上选择长度为\(M\)的半开区间\([x,x+M)\),并获得其中包含的所有礼物。求:......
  • AtCoder Beginner Contest 224 H Security Camera 2
    洛谷传送门AtCoder传送门直接糊一手线性规划对偶板板。要求:\[\min\sumA_il_i+\sumB_ir_i\]\[\foralli,j,l_i+r_j\geC_{i,j}\]\[l_i,r_i\ge0\]\[l_i,r_i\in\mathbb{Z}\]可以证明\(l_i,r_i\)为整数的限制可以去掉,因为取到最优解时\(l_i,r_i\)一......
  • AtCoder Beginner Contest(abc) 314
    B-Roulette难度:⭐题目大意有一个猜数字的游戏,有n个人参加,每人都猜了若干个数;最后给出答案数字;在所有猜中数字的人中输出猜数数量最少的人的编号;(可能不止一个);解题思路数据不大,暴力即可;神秘代码#include<bits/stdc++.h>#defineintlonglong#def......
  • AtCoder Beginner Contest 326 F
    F-RobotRotation一句话不开LL,见祖宗感谢大佬,和洛谷上的题解上面已经将的很清楚了,但是如果你跟我一样一开始看不懂他们的代码,那么这篇可能为你解惑点击查看代码#include<bits/stdc++.h>usingnamespacestd;#defineLLlonglong#defineintLL//LL!map<LL,LL>ma;......
  • AtCoder Beginner Contest(abc) 312
    B-TaKCode难度:⭐题目大意题目定义一种矩阵X:该矩阵的是一个长度为9的由黑白色块组成正方形矩阵;该矩阵的左上角和右下角都是一个3*3的黑色矩阵(总共18个),这两个黑色矩阵外面(边缘不算)包围一圈白色色块(总共14个);现在一个n*m的黑白矩阵,问这个大矩阵中有多少......
  • AT_abc326_e Revenge of "The Salary of AtCoder Inc." 题解
    AT_abc326_eRevengeof"TheSalaryofAtCoderInc."题解一道简单的概率论+动态规划题目(然而我赛时没看这道题题意有一个长度为\(n\)的序列\(A\)、一个\(n\)面骰子,掷若干次骰子,如果这一次掷骰子的点数小于等于上一次的点数,则结束。定义这若干次掷骰子的总的结果为,每次......
  • AtCoder Beginner Contest(abc) 311
    B-VacationTogether难度:⭐题目大意给定n个人的工作计划,'o'表示这天休息,'x'表示工作;请找出一段最长的所有人都休息的连续休息的天数;解题思路数据不大,暴力即可;神秘代码#include<bits/stdc++.h>#defineintlonglong#defineIOSios::sync_with_stdio......
  • AtCoder Beginner Contest 321(ABC321)
    A.321-likeChecker直接模拟。CodeB.Cutoff直接暴力枚举\([0\sim100]\),每次把第\(n\)个数当作当前枚举的\(i\),然后看看条件是否满足。CodeC.321-likeSearcherDescription给你一个\(K\),求出\([1\simK]\)区间内有多少个321-likeNumber。321-likeNumber的......