1 条题解

  • 0
    @ 2025-8-24 22:49:20

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar S__X
    且放白鹿青崖间,须行即骑访名山

    搬运于2025-08-24 22:49:20,当前版本为作者最后更新于2023-01-24 16:19:51,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    题目简化

    给你一个数,从它的个位到最高位进行操作,对于其每一位,你可以选择让他增加 11,减少 11(如果当前位是 00,减 11 后会退位) 或者不变。

    分析

    要使每一位的总和最大,我们可以对每一位进行判断。

    • 如果当前位不是 0099,那么显然要加一。如:1212,最大总和即为每一位加一再相加。

    • 如果当前位是 00 就减一。简单证明: 1-1 后,当前位变成 99,下一位因为退位需要 1-1。这样子总和增加了 91=89-1=8,显然比增加 11 更优。如 100100,最大总和即为个位减一再相加 (99)(99)。当然,如果 a=0a=0 就要特判。

    • 当前位上的数值为 99 时,不需要操作,证明平凡,和上面相似。

    代码:

    #include<bits/stdc++.h>
    using namespace std;
    int main(){
    	int n;
    	cin>>n;
    	while(n--){
    		int a,sum=0;
    		cin>>a;
    		if(a==0) sum=1;//特判
    		else {
    			while(a!=0){
    				if(a%10==0) a-=1;//当前值为0时
    				else if(a%10!=9) a+=1;//当前值为1~8时
    				//为9时不变
    				sum+=(a%10);//加和
    				a/=10;
    			}
    		}
    		cout<<sum<<endl;
    	}
    	return 0;
    }
    
    • 1

    信息

    ID
    8314
    时间
    1000ms
    内存
    128MiB
    难度
    2
    标签
    (无)
    递交数
    0
    已通过
    0
    上传者