蓝桥杯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;
}
相关推荐
guozhetao9 分钟前
【ST表、倍增】P7167 [eJOI 2020] Fountain (Day1)
java·c++·python·算法·leetcode·深度优先·图论
吃着火锅x唱着歌11 分钟前
LeetCode 611.有效三角形的个数
算法·leetcode·职场和发展
爱喝矿泉水的猛男11 小时前
非定长滑动窗口(持续更新)
算法·leetcode·职场和发展
YuTaoShao11 小时前
【LeetCode 热题 100】131. 分割回文串——回溯
java·算法·leetcode·深度优先
六哥探店实录120 小时前
外带服务的温度:藏在包装里的“生活共情力”
经验分享·职场和发展·生活·创业创新·学习方法·新浪微博·餐饮行业
Alfred king1 天前
面试150 IPO
面试·职场和发展·贪心·数组··排序
Luntu1 天前
哪些人需要用到MBTI职业性格测试?
面试·职场和发展·求职招聘
月阳羊1 天前
【硬件-笔试面试题】硬件/电子工程师,笔试面试题-26,(知识点:硬件电路的调试方法:信号追踪,替换,分段调试)
笔记·嵌入式硬件·面试·职场和发展
ManageEngineITSM1 天前
从混乱到秩序:IT服务管理如何重塑企业运营效率
大数据·人工智能·程序人生·职场和发展·itsm
恣艺2 天前
LeetCode 127:单词接龙
算法·leetcode·职场和发展