Codeforces Round 927 (Div. 3)

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述

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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值