AtCoder Beginner Contest 384 Solution

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;
}
posted @ 2024-12-15 15:52  ~清渠~  阅读(37)  评论(0编辑  收藏  举报