首页 > 其他分享 >AtCoder Beginner Contest 384 Solution

AtCoder Beginner Contest 384 Solution

时间:2024-12-15 15:58:24浏览次数:5  
标签:AtCoder int ll Solution long cin 384 rep define

A - aaaadaa (abc384 A)

题目大意

给个长度为n的字符串,以及两个字母a和b,要求把字符串中不是a的字符全部都变成b。

解题思路

一个循环判断一下就行了。

代码

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n;
    char a, b;
    cin >> n >> a >> b;
    string s;
    cin >> s;
    for (int i = 0; i < n; i++)
    {
        if (s[i] != a) s[i] = b;
    }
    cout << s;
    return 0;
}

B - ARC Division (abc384 B)

题目大意

有两种比赛,div1在1600-2799的范围内计算入rating,div2在1200-2399的范围内计算入rating,给定n场比赛,告诉你每场比赛是div几,并且给定这场比赛后变化的分数,如果当前分数在计入rating的范围内,就会产生这个变化,否则什么都不会发生,求最后的rating

解题思路

按照题意模拟即可。

代码

#include<bits/stdc++.h>
#define rep(i,n) for(int i=0;i<n;i++)
#define all(v) v.begin(),v.end()
#define vi vector<int>
#define ll long long
using namespace std;
int main()
{
    int n, r;
    cin >> n >> r;
    while (n--) {
        int d, a;
        cin >> d >> a;
        if (d == 1 && r >= 1600 && r <= 2799) r += a;
        else if (d == 2 && r >= 1200 && r <= 2399) r += a;
    }
    cout << r;
    return 0;
}

C - Perfect Standings (abc384 C)

题目大意

给定五道题的分数,一共有31个人,他们分别做出了A,B,C,D,E,AB,AC,AD...ABCDE,总之就是每个人都做出题了,并且每个人做出的题目序列都不一样,请你把这31个人的分数排序,如果分数相同,按字母小的靠前。

解题思路

01穷举,统计一下分数就行。

代码

#include<bits/stdc++.h>
#define rep(i,n) for(int i=0;i<n;i++)
#define all(v) v.begin(),v.end()
#define vi vector<int>
#define ll long long
using namespace std;
int main()
{
    int c[10];
    rep(i, 5) cin >> c[i];
    pair<int, string> a[50];
    int k = 0;
    for (int i = 0;i < (1 << 5);i++) {
        string t = "";
        int p = 0;
        for (int j = 0;j < 5;j++) {
            if (i & (1 << j)) {
                t += char('A' + j);//当前人做出的题目字符串
                p += c[j];
            }
        }
        a[k++] = { -1 * p,t };//按分数从大到小,字符串字母序从小到大
    }
    sort(a, a + k);
    rep(i, k) cout << a[i].second << endl;
    return 0;
}

D - Repeated Sequence (abc384 D)

题目大意

给定一个数组,由这个数组不断循环可以得到一个无限长的数组,问这个数组当中有没有连续一段的和为S。

解题思路

一段连续串是由一段后缀,几段数组重复,一段前缀三个部分构成,那么我们把所有的后缀和放进一个set里,然后从前往后循环,用s减去前缀和,模数组总和,看剩下的是否在后缀和里出现过即可。

代码

#include<bits/stdc++.h>
#define rep(i,n) for(int i=0;i<n;i++)
#define all(v) v.begin(),v.end()
#define vi vector<int>
#define ll long long
using namespace std;
int n;
ll s;
ll a[200005];
int main()
{
    cin >> n >> s;
    ll sum = 0;
    set <ll> ss;
    rep(i, n) {
        cin >> a[i];
        sum += a[i];
        ss.insert(sum);
    }
    ss.insert(0);
    ll t = 0;
    for (int i = n - 1;i >= 0;i--) {
        if (ss.count((s - t) % sum)) {
            cout << "Yes";
            return 0;
        }
        t += a[i];
    }
    if (ss.count((s - t) % sum)) {
        cout << "Yes";
        return 0;
    }
    cout << "No";
    return 0;
}

E - Takahashi is Slime 2 (abc384 E)

题目大意

给定一个二维平面地图,每个位置都是一个史莱姆,每个史莱姆都有一个数值。

takahashi一开始在P,Q的位置,他可以吞并附近的,小于他当前数值1/X的史莱姆,并把它的数值加到自己头上,问他最后最大数值能到多少。

image-1

image-2

解题思路

很好的优先队列题,用优先队列进行BFS,按照数值排序,每次看队头能不能吞并,如果能吞并就吞,并且把这个吞并的史莱姆的新的邻近格压进队列。

代码

#include<bits/stdc++.h>
#define rep(i,n) for(int i=0;i<n;i++)
#define all(v) v.begin(),v.end()
#define vi vector<int>
#define ll long long
using namespace std;
ll a[505][505];
bool vis[505][505];
const int dx[4] = { 1, 0, -1, 0 };
const int dy[4] = { 0, 1, 0, -1 };
ll k;
bool sless(ll x, ll y) {
    if (x % k == 0) return y < (x / k);
    else return y <= (x / k);
}
int main()
{
    int h, w;
    cin >> h >> w >> k;
    int x, y;
    cin >> x >> y;
    x--;y--;
    int sx = x, sy = y;
    priority_queue<pair<ll, pair<int, int> >, vector<pair<ll, pair<int, int> > >, greater<pair<ll, pair<int, int> > >> q;
    rep(i, h) rep(j, w) {
        cin >> a[i][j];
    }
    ll ans = 0;
    q.push({ ans,{ x, y } });
    vis[x][y] = 1;
    while (!q.empty()) {
        x = q.top().second.first;
        y = q.top().second.second;
        ll t = q.top().first;

        q.pop();
        if ((x == sx && y == sy) || sless(ans, a[x][y])) {
            // cout << ans << " " << t << " " << x << " " << y << endl;
            ans += a[x][y];
            rep(i, 4) {
                int nx = x + dx[i];
                int ny = y + dy[i];
                if (nx < 0 || nx >= h || ny < 0 || ny >= w || vis[nx][ny]) continue;
                vis[nx][ny] = 1;
                q.push({ a[nx][ny],{ nx,ny } });
            }
        }
    }
    cout << ans << endl;
    return 0;
}

标签:AtCoder,int,ll,Solution,long,cin,384,rep,define
From: https://www.cnblogs.com/NightRaven/p/18608072

相关文章

  • ABC 384 F
    ABC384Fabc经典EF出式子题。问题陈述对于正整数\(x\),定义\(f(x)\)如下:"当\(x\)是偶数时,继续除以\(2\)。经过这些除法后,\(x\)的最终值为\(f(x)\)"。例如,\(f(4)=f(2)=f(1)=1\)和\(f(12)=f(6)=f(3)=3\)。已知长度为\(N\)的整数序列\(A=(A_1,A_2,\ldots,A......
  • AtCoder Beginner Contest 383
    省流版A.模拟加水漏水即可B.枚举两个加湿器的位置,然后统计加湿的单元格数量即可C.从每个加湿器进行\(BFS\)即可D.考虑因子个数的计算,分情况枚举质因数即可E.考虑\(f\)函数的求法,从小到大加边,考虑每条边对答案的贡献即可F.对颜色排序,在\(01\)背包的基础上,新增一个......
  • atcoder 杂题 #03
    atcoder杂题#03arc189_bMinimizeSumabc227_fTreasureHuntingarc189_dTakahashiisSlimearc067_eGroupingarc189_b题目大意:数轴上有\(n\)个点\(x_i\),每次可以选择连续递增四个点,记\(M\)为第一个和第四个点的中点,把第二个和第三个点关于\(M\)对称,问不断操作......
  • AtCoder Regular Contest 189 (Div. 2)
    A计数B折叠差不变D观察性质暴力#include<bits/stdc++.h>usingnamespacestd;#definepbpush_back#defineendl'\n'#defineLLlonglongconstintN=5e5+10;intn,a[N],l[N],r[N];LLpre[N],suf[N],b[N];voidsolve(){cin>>n;......
  • AtCoder Beginner Contest 383
    AtCoderBeginnerContest383//前三题都很水,只能写写这种题骗自己了A-Humidifier1​ 直接模拟#include<bits/stdc++.h>usingnamespacestd;#defineintlonglong#defineinfINT32_MAX#definePIIpair<int,int>#defineendl'\n'inlinevoidsolve(){......
  • Atcoder Beginner Contest 380 (D~G)
    D.StrangeMirroring题意:给定一个只含有大小写字母的字符串$S$。现在对这个字符串操作无数次:对于$S$的每个字符,若是大写字母就改为对应的小写字母,否则改成对应的大写字母,形成一个新的字符串$T$。将$S$和$T$首尾连接,形成新的$S$。现在给定$Q$次......
  • [题解](更新中)AtCoder Beginner Contest 383(ABC383) A~E
    A-Humidifier1照题意模拟即可,时间复杂度\(O(n)\)。点击查看代码#include<bits/stdc++.h>#defineintlonglong#defineN110usingnamespacestd;intn,t[N],v[N],sum;signedmain(){ cin>>n; for(inti=1;i<=n;i++)cin>>t[i]>>v[i]; for(inti=1......
  • Advent of Code 2022 solution [Mathematica/Scala/MATLAB/Julia/JavaScript]
    目录简介试题地址Day1Part1andPart2Day2Part1andPart2Day3Part1andPart2Day4Part1andPart2Day5Part1andPart2Day6Part1andPart2Day7Part1andPart2Day8Part1andPart2Day9Part1andPart2Day10Part1andPart2Day11Part1andPart......
  • 【Atcoder】【ABC383】A- Humidifier 1加湿器 题解
    前言不知道大家有没有关注过AtCoder这是小日子那边的一个网站,每周都会有比赛比起CF等等,最大的优点就是延迟低,题目质量也不错计划以后每周更新题解了正文题目传送门A-Humidifier1题目大意有一个加湿器,给定有次操作,第次在时间加入胜水然而,如果加湿器里有水,它每个单......
  • Daiwa Securities Co. Ltd. Programming Contest 2024(AtCoder Beginner Contest 383)-C
    题目大意一个\(H\)行和\(W\)列的网格图。\((i,j)\)表示从上到下第\(i\)行和从左到下第\(j\)列的单元格。每个单元格用字符\(S_{i,j}\)表示。如果\(S_{i,j}\)为#,则该单元格有一个障碍物;如果\(S_{i,j}\)是.则该单元格是空的;如果\(S_{i,j}\)为H,则该单元网格图......