首页 > 其他分享 >UNIQUE VISION Programming Contest 2023 Autumn(AtCoder Beginner Contest 323)

UNIQUE VISION Programming Contest 2023 Autumn(AtCoder Beginner Contest 323)

时间:2023-10-08 12:22:05浏览次数:43  
标签:AtCoder Beginner Contest int ll long using fi se

UNIQUE VISION Programming Contest 2023 Autumn(AtCoder Beginner Contest 323)

A. Weak Beats

解题思路:

按题意模拟即可。

代码:

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

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

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

B. Round-Robin Tournament

解题思路:

暴力统计每一行有多少个\(o\),然后排个序即可。

代码:

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<int, int>;
#define fi first
#define se second
bool cmp(pii a, pii b)
{
    if (a.fi != b.fi)
    {
        return a.fi > b.fi;
    }
    return a.se < b.se;
}
void solve()
{
    int n;
    cin >> n;
    vector<pii> cnt(n);
    for (int i = 0; i < n; i++)
    {
        string s;
        cin >> s;
        cnt[i].se = i;
        for (auto c : s)
        {
            if (c == 'o')
            {
                cnt[i].first++;
            }
        }
    }
    sort(cnt.begin(), cnt.end(), cmp);
    for (auto v : cnt)
    {
        cout << v.se + 1 << ' ';
    }
}

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

C. World Tour Finals

解题思路:

从大到小枚举每个玩家的分数,从大到小枚举每到题的分数,如果没选过就选上,一旦大于了最大值,新加的题数就是答案。

代码:

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

void solve()
{
    int n, m;
    cin >> n >> m;
    vector<int> a(m + 1);
    vector<pii> b(m + 1);
    for (int i = 1; i <= m; i++)
    {
        cin >> a[i];
        b[i].fi = a[i];
        b[i].se = i;
    }
    vector<pii> p(n + 1);
    vector<vector<bool>> st(n + 1, vector<bool>(m + 1));
    for (int i = 1; i <= n; i++)
    {
        p[i].fi += i;
        p[i].se = i;
        string s;
        cin >> s;
        s = ' ' + s;
        for (int j = 1; j <= m; j++)
        {
            if (s[j] == 'o')
            {
                st[i][j] = true;
                p[i].fi += a[j];
            }
        }
    }
    sort(p.begin() + 1, p.end());
    sort(b.begin() + 1, b.end());
    vector<int> ans(n + 1);

    for (int i = n; i; i--)
    {
        int cnt = 0;
        int cur = 0;
        if (i == n)
        {
            if (p[n - 1].fi == p[i].fi)
            {
                cur = p[i].fi;
            }
            else
            {
                continue;
            }
        }
        else
        {
            cur = p[i].fi;
        }
        for (int j = m; j; j--)
        {
            if (!st[p[i].se][b[j].se])
            {
                cur += b[j].fi;
                cnt++;
                if (cur > p[n].fi)
                {
                    ans[p[i].se] = cnt;
                    break;
                }
            }
        }
    }
    for (int i = 1; i <= n; i++)
    {
        // cout << p[i].fi << ' ' << p[i].se << endl;
        cout << ans[i] << endl;
    }
}

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

D. Merge Slimes

解题思路:

从小到大看,能合并就合并。合并得到的继续能合并就合并。

每次合并剩余的不能合并的(就是只剩一个的),记得累加。

代码:

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

void solve()
{
    int n;
    cin >> n;
    map<ll, ll> v;
    for (int i = 1; i <= n; i++)
    {
        int a, b;
        cin >> a >> b;
        v[a] = b;
    }
    for (auto &a : v)
    {
        ll cur = 1;
        ll res = a.se >> 1;
        a.se = a.se % 2;
        ll t = a.fi;
        while (res)
        {
            cur = res >> 1;
            t <<= 1;
            if (v.count(t))
            {
                v[t] += (res % 2);
            }
            else
            {
                v[t] = (res % 2);
            }
            res >>= 1;
        }
    }
    ll ans = 0;
    for (auto a : v)
    {
        // cout << a.fi << ' ' << a.se << endl;
        ans += a.se;
    }
    cout << ans;
}

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

E. Playlist

解题思路:

\(f[i]\):如\(X\)为\(i\),答案为多少。

\(f[0]\)第一步只能选第一首歌,所以答案就是\(\frac{1}{n}\)。

对于每一个\(i\),遍历所有的歌。

对于第\(j\)首歌:

  • 若\(t[j] > i\),那么情况等同于\(f[0]\),即我们选了这首歌,\(X +0.5\)放的就是这首。所以如果\(j == 1,f[i] = f[i] + \frac{1}{n}\)。
  • 若\(t[j] \leq i\),那么情况等同于\(f[i-t[j]]\)。\(f[i - t[j]]\)相当于时间\(0 \rightarrow (i - t[j])\),就是要求选歌使得第\((i - t[j])+0.5\)秒后放的是第一首歌。\(f[i]\)可以相当于时间\(t[j] \rightarrow i\),同样要求选歌使得第\((i - t[j])+0.5\)秒后放的是第一首歌。二者问题等价。

时间复杂度:\(O(nx)\)

代码:

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<int, int>;
#define fi first
#define se second
const int mod = 998244353;
ll qmi(ll a, ll b)
{
    ll res = 1;
    while (b)
    {
        if (b & 1)
        {
            res = (res * a) % mod;
        }
        b >>= 1;
        a = (a * a) % mod;
    }
    return res;
}

void solve()
{
    int n, x;
    cin >> n >> x;
    vector<int> t(n + 1);
    for (int i = 1; i <= n; i++)
    {
        cin >> t[i];
    }
    // f[i]:X为i时的可能性
    vector<ll> f(x + 10);
    // X为0时,第一步就要选到第一首歌,所以答案是1/n
    f[0] = qmi(n, mod - 2);
    // X为i时,如果要X+0.5秒的时候正好在放第1首歌。
    // 如果t[j] > i,意味着我们第一首歌如果点j,那么X + 0.5时播放的就是第j首,这和X等于0等价
    // 所以若此时j == 1,那么答案加上1 / n。
    // 如果t[j] <= i,意味着我们可以从f[i - t[j]]转移过来。
    // 从i - t[j] 到 i 和 从 0 到 i 是等价的。所以此时f[i] += f[i - t[j]].
    // 由于从每个(i - t[j])转移过来的情况是独立的,所以就可以变成加法了。
    ll inv = qmi(n, mod - 2);
    for (int i = 1; i <= x; i++)
    {
        for (int j = 1; j <= n; j++)
        {
            if (t[j] > i)
            {
                f[i] = (f[i] + (j == 1) * inv) % mod;
            }
            else
            {
                f[i] = (f[i] + f[i - t[j]] * inv) % mod;
            }
        }
    }
    cout << f[x];
}

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

标签:AtCoder,Beginner,Contest,int,ll,long,using,fi,se
From: https://www.cnblogs.com/value0/p/17748588.html

相关文章

  • AtCoder Beginner Contest 323
    有的人边上课边打abcA-WeakBeats(abc323A)题目大意给定一个\(01\)字符串,问偶数位(从\(1\)开始)是否全为\(0\)。解题思路遍历判断即可。神奇的代码#include<bits/stdc++.h>usingnamespacestd;usingLL=longlong;intmain(void){ios::sync_with_stdio......
  • [Leetcode Weekly Contest]365
    链接:LeetCode[Leetcode]2873.有序三元组中的最大值I给你一个下标从0开始的整数数组nums。请你从所有满足i<j<k的下标三元组(i,j,k)中,找出并返回下标三元组的最大值。如果所有满足条件的三元组的值都是负数,则返回0。下标三元组(i,j,k)的值等于(nums[i]......
  • 2022 China Collegiate Programming Contest (CCPC) Mianyang Onsite
    2022ChinaCollegiateProgrammingContest(CCPC)MianyangOnsiteC.CatchYouCatchMe解题思路:站在距离出口最近的点等深度深的蝴蝶飞上来即可。时间复杂度:\(O(n)\)代码:#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;voidsolve(){ intn......
  • AtCoder Grand Contest 057 E RowCol/ColRow Sort
    洛谷传送门AtCoder传送门首先考虑一个经典的套路:转\(01\)。具体而言,我们考虑若值域是\([0,1]\)怎么做。发现可以很容易地判定一个\(A\)是否合法。设矩阵第\(i\)行的和为\(r_i\),第\(j\)列的和为\(c_j\),那么合法当且仅当\(A\)的\(\{r_i\}\)和\(\{c_j\}\)(可重集......
  • 2022 China Collegiate Programming Contest (CCPC) Weihai Site EAJGCI
    2022ChinaCollegiateProgrammingContest(CCPC)WeihaiSite目录2022ChinaCollegiateProgrammingContest(CCPC)WeihaiSiteVP概况E-PythonWillbeFasterthanC++A-DunaiJ-Eat,Sleep,RepeatG-Grade2C-GrassI-DragonBloodlineVP概况这场我一年......
  • 2022-2023 ICPC Central Europe Regional Contest
    The1stUniversalCup.Stage8:SloveniaD.Deforestation这道题出题人比较谜语人,对于一个分叉点,只能选择若干个儿子和父亲组成一组,剩下的儿子之间不能相互组合。所以从叶子节点开始贪心处理就好。对于一个父亲他有若干个儿子,就贪心的选择剩下部分更小的儿子。#include<bits......
  • The 2021 ICPC Asia Macau Regional Contest
    A.SoI'llMaxOutMyConstructiveAlgorithmSkills首先一行正一行反的把所有的行拼到一起,然后判断一下正着走时候合法不合法就反过来走就好。#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongusingvi=vector<int>;voidsolve(){intn;......
  • The 2022 ICPC Asia Jinan Regional Contest
    A.Tower首先用了dp验证出把一个数字变成另一个数字的最优解一定是能除就先进行除法,然后再使用加一减一。这样我们就有\(O(\logn)\)的复杂度求出把一个数变成另一个数的最小代价。然后就是猜测最终的目标一定是某个数除了若干次二得到的。所以就枚举一下目标即可。#include......
  • The 2018 ACM-ICPC Asia Qingdao Regional Contest, Online (The 2nd Universal Cup
    The2018ACM-ICPCAsiaQingdaoRegionalContest,Online(The2ndUniversalCup.Stage1:Qingdao)J-PresstheButton\(1\leqa,b,c,d\leq10^6\)题解容易发现存在循环节,每次位于\(gcd(a,c)\)的倍数的位置所以我们考虑处理一个循环节内的情况如果\(v\le......
  • AtCoder Grand Contest 036 F Square Constraints
    洛谷传送门AtCoder传送门本质是\(p_i\in[l_i,r_i]\)的计数问题。当\(1\lei\len\)时,\(l_i\)才可能不等于\(1\)。考虑容斥,设钦定\(m\)个不满足条件(上界为\(l_i-1\)),其余任意(上界为\(r_i\))。然后按照上界排序后dp,设\(f_{i,j}\)为考虑前\(i\)个元素,已经......