我是靠谱客的博主 朴素电灯胆,最近开发中收集的这篇文章主要介绍【CF1626B】minor reduction,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

传送门

题目:

给一个数,只能对相邻两个数字做加法,然后把加后的数取代原来两个数字,求max

思路:

加法后要么一位要么两位
我们优先考虑两位的,两位必然变小
我们希望它不要再高位变小
所以反向遍历有否两位的结果,若有则进行替换并输出
若没有两位的结果,我们被迫选择一位的,一位的总会变大,我们希望最高位变大
因此一位的加法结果只选前两个即可

ac代码:

//
// Created by 009 on 2022/3/8.
//

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

int main() {
    int t;
    cin >> t;
    while(t--) {
        string s;
        cin >> s;
        // 相加肯定会变小
        // 两位数变化更小
        // 从右边遍历
        // 一位数变大,但位数减少,就看第一个
        int n = s.size();
        bool flag = false;
        for(int i = n - 1; i >= 1; i--) {
            int x = s[i] - '0';
            int y = s[i - 1] - '0';
            int z = x + y;
            if(z >= 10) {
                s[i - 1] = z / 10 + '0';
                s[i] = z % 10 + '0';
                flag = true;
                cout << s << endl;
                break;
            }
        }
        if(flag) continue;

        // 没有两位数,被迫减位,从左端开始
        int x = s[0] - '0';
        int y = s[1] - '0';
        int z = x + y;
        s.erase(s.begin());
        s[0] = z + '0';
        cout << s << endl;
    }
}

总结:

非常贪心
分析不到位,我也看出来只有一位和两位的加法结果
后面就束手无策了,还是经验不够丰富
继续分类讨论,两位的更好,但会小,所以希望放在后面
实在不行的就一位,放在最前面会变大即可

最后

以上就是朴素电灯胆为你收集整理的【CF1626B】minor reduction的全部内容,希望文章能够帮你解决【CF1626B】minor reduction所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(39)

评论列表共有 0 条评论

立即
投稿
返回
顶部