Codeforces Round 927 (Div. 3)

本文概述了CodeforcesRound927比赛中的四个问题,包括跑酷策略、年份计算、栈模拟和计数问题的解法,以及相应的AC代码。涉及的关键技巧如避开陷阱、整数倍计算和高效数据结构使用。
摘要由CSDN通过智能技术生成

在这里插入图片描述

Codeforces Round 927 (Div. 3)

A. Thorns and Coins

题意:跑酷,每次移动一格或两格,遇到金币加一分,遇到陷阱停止跑酷,最多得多少分。

思路:n很小,顺着捋就行,一次一格,尽量避开陷阱,避不开的时候停止(两格以上连续陷阱)。

AC code:

void solve() {
    cin >> n;
    int ans = 0;
    string s; cin >> s;
    for (int i = 0; i < n; i ++) {
        if (s[i] == '@') ans ++;
        else if (s[i] == '*') {
            if (s[i + 1] != '*') continue;
            else {
                cout << ans << endl;
                return;
            }
        }
    }
    cout << ans << endl;
}

B. Chaya Calendar

题意:有n个征兆,第i个征兆会在ai年的整数倍年出现,求第n个征兆出现年份。

思路:累加年份即可,碰到非整数倍的年份向上取整即可。

AC code:

void solve() {
    cin >> n;
    for (int i = 0; i < n; i ++) cin >> a[i];
 
    int now = 0;
    for (int i = 0; i < n; i ++) {
        if (now < a[i]) now += (a[i] - now);
        else if (now == a[i]) {
            now += a[i];
        } else {
            int x = now / a[i];
            now = (x + 1) * a[i];
        }
    }
    cout << now << endl;
}

C. LR-remainders

题意:长度为n的整数数组a,给出n个命令,每个命令可以取出当前最左/右的元素,每次命令前输出当前剩余所有元素的积除m的余数。

思路:用栈模拟这个过程即可,因为已经提前得知命令取出元素的顺序了,最后取出的元素用的最久。、

AC code:

void solve() {
    cin >> n >> m;
    for (int i = 1; i <= n; i ++) cin >> a[i];
    string s; cin >> s;
    s = " " + s;
    stack<int> q;
 
    int l = 1, r = n, t = 1;
    for (int i = 1; i <= n; i ++) {
        if (s[i] == 'L') q.push(a[l]), l ++;
        else q.push(a[r]), r --;
    }
    int sum = 1;
    vector<int> b;
    while (!q.empty()) {
        auto t = q.top();
        q.pop();
        sum *= t;
        sum %= m;
        b.pb(sum);
    } 
    reverse(b.begin(), b.end());
    for (auto x : b) cout << x << " ";
        cout << endl;
}

D. Card Game

题意:略,太长了。

思路:顺着题意模拟,让非王牌内耗,再用王牌耗,看能不能耗完即可,大模拟。

AC code:

void solve() {
    cin >> n;
    char ki; cin >> ki;
    map<char, vector<string>> mp;
    for (int i = 0; i < 2 * n; i ++) {
        string s; cin >> s;
        mp[s[1]].pb(s);
    }
    vector<char> fi = {'C', 'D', 'H', 'S'};
    for (char c : fi) {
        sort(mp[c].begin(), mp[c].end());
    }
    int cnt = 0;
    for (char c : fi) {
        if (c != ki && mp[c].size() % 2 == 1) cnt ++;
    }
    if (cnt > mp[ki].size() || mp[ki].size() % 2 != cnt % 2) {
        cout << "IMPOSSIBLE" << endl;
        return;
    }
 
    for (char c : fi) {
        if (c == ki) continue;
        if (mp[c].size() % 2 == 1) {
            cout << mp[c].back() << " " << mp[ki].back() << endl;
            mp[c].pop_back(), mp[ki].pop_back();
        } 
    }
    for (char c : fi) {
        for (int i = 0; i < mp[c].size(); i += 2) {
            cout << mp[c][i] << " " << mp[c][i + 1] << endl;
        }
    }
}

E. Final Countdown

题意:一串数字倒计时到0,每一位一共需要变化多少次。

思路:可以看出,第i位的变化次数为1到i位的十进制,从前往后每一位的和类似前缀和,因为数可能很大,计算的时候从后往前用高精度的方式计数,注意最后可能多进一位的情况。

AC code :

void solve() {
    cin >> n;
    string s; cin >> s;
    string ans = "";
    reverse(s.begin(), s.end());
    int sum = 0, aid = 0;
    for (char c : s) {
        sum += (c - '0');
    }
    for (char c : s) {
        char now = ((sum + aid) % 10) + '0';
        ans.pb(now);
        aid = (sum + aid) / 10;
        sum -= (c - '0');
    }
    if (aid == 1) {
        reverse(ans.begin(), ans.end());
        cout << 1 << ans << endl;
    } else {
        while (ans.back() == '0') ans.pop_back();
        reverse(ans.begin(), ans.end());
        cout << ans << endl;
    }
}
  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Codeforces Round 894 (Div. 3) 是一个Codeforces举办的比赛,是第894轮的Div. 3级别比赛。它包含了一系列题目,其中包括题目E. Kolya and Movie Theatre。 根据题目描述,E. Kolya and Movie Theatre问题要求我们给定两个字符串,通过三种操作来让字符串a等于字符串b。这三种操作分别为:交换a中相同位置的字符、交换a中对称位置的字符、交换b中对称位置的字符。我们需要先进行一次预处理,替换a中的字符,然后进行上述三种操作,最终得到a等于b的结果。我们需要计算预处理操作的次数。 根据引用的讨论,当且仅当b[i]==b[n-i-1]时,如果a[i]!=a[n-i-1],需要进行一次操作;否则不需要操作。所以我们可以遍历字符串b的前半部分,判断对应位置的字符是否与后半部分对称,并统计需要进行操作的次数。 以上就是Codeforces Round 894 (Div. 3)的简要说明和题目E. Kolya and Movie Theatre的要求。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Codeforces Round #498 (Div. 3) (A+B+C+D+E+F)](https://blog.csdn.net/qq_46030630/article/details/108804114)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [Codeforces Round 894 (Div. 3)A~E题解](https://blog.csdn.net/gyeolhada/article/details/132491891)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值