蓝桥杯2022年第十三届决赛真题-最大数字

知识点:

double -------(max)10的308次幂

long long ---------(max)10的18次幂

过 96% 的方法

贪心思想:根据数据范围,很容易想到应该用for遍历每一位,复杂度是O(1)。从前往后看每一位,比较通过+到达9和通过-到达9的个数,选择消耗数比较小的数,并且需要对应的A或B>0,如果最后A和B都不足以补充9,就把A消耗完。

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
string N;
int A,B;

signed main(){
    cin>>N>>A>>B;
    int len = N.length();
    for(int i=0;i<len;i++){
        int a = 9-(N[i]-'0');
        int b = 10-abs(a);
        if(A==0&&B==0)break;
        if(a<b){
            if(A>=a){
                N[i]='9';
                A-=a;
            }else{
                if(B>=b){
                    N[i]='9';
                    B-=b;
                }else{
                    N[i]+=A;
                    A=0;
                }
            }
        }else{
            if(B>=b){
                N[i]='9';
                B-=b;
            }else{
                if(A>=a){
                    N[i]='9';
                    A-=a;
                }else{
                    N[i]+=A;
                    A=0;
                }
            }
        }
    }
    cout<<N<<endl;
    return 0;
}

正解

dfs:枚举每一位,对他进行+或-的搜索

时间复杂度分析:递归深度是位数最多为17,每一位都可以+或者-,所以是O(2^17)。但是A和B最多是100,所以经过剪枝,A和B的限制条件下,最多进行递归调用200次,也就是O(200)。

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
string N;
int A,B;
int res,bit;

void dfs(string N1,int bit2,int A,int B){
    int n = stoll(N1);
    //mac表示max用不了得自己写一个
    res = res>n?res:n;
    
    //递归出口
    if((A==0&&B==0)||bit2==bit)return;
    
    int a = 9-(N1[bit2]-'0');
    int b = (N1[bit2]-'0')+1;
    string temp = N1;
    
    //递归调用
    if(A>=a){
        N1[bit2]='9';
        dfs(N1,bit2+1,A-a,B);
    }else{
        N1[bit2]+=A;
        dfs(N1,bit2+1,0,B);
    }
    //不同的递归分支,上面不能影响下面,要恢复现场
    N1 = temp;
    if(B>=b){
        N1[bit2]='9';
        dfs(N1,bit2+1,A,B-b);
    }
}

signed main(){
    cin>>N>>A>>B;
    bit = N.length();
    dfs(N,0,A,B);
    cout<<res<<endl;
    return 0;
}
相关推荐
城管不管14 小时前
重生——第九次面试2026.8.13某车一面
分布式·ai·面试·职场和发展·rabbitmq
琥珀色糖16 小时前
leetcode hot100题(持续更新)移动零(双指针)
算法·leetcode·职场和发展·双指针·移动零
Dr.kangder17 小时前
嵌入式面试总结(十四)——中断处理
单片机·面试·职场和发展·架构·硬件架构·嵌入式
Dr.kangder18 小时前
嵌入式面试总结(十)——流水线
单片机·嵌入式硬件·面试·职场和发展·系统架构·嵌入式
依然鸣18 小时前
PTA团体程序设计天梯赛L2真题讲解L2-005-008
开发语言·数据结构·c++·算法·深度优先·pat考试·图论
淡海水21 小时前
C#与常用数据结构源码剖析-全篇导览
开发语言·数据结构·unity·面试·职场和发展·c#
依然鸣1 天前
PTA团体程序设计天梯赛L2真题讲解L2-001-004
经验分享·学习·算法·深度优先·pat考试
.道阻且长.1 天前
5.LeetCode算法习题讲解--双指针--有效三角形的个数
算法·leetcode·职场和发展
想吃火锅10052 天前
【leetcode】300. 最长递增子序列
算法·leetcode·职场和发展
Dr.kangder2 天前
嵌入式面试总结(八)——大小端
嵌入式硬件·面试·职场和发展·架构·嵌入式