蓝桥杯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;
}
相关推荐
qystca4 小时前
P8803 [蓝桥杯 2022 国 B] 费用报销
蓝桥杯
边跑边掩护5 小时前
LeetCode 820 单词的压缩编码题解
算法·leetcode·职场和发展
wuqingshun3141596 小时前
蓝桥杯 10. 全球变暖
c++·算法·职场和发展·蓝桥杯
八股文领域大手子8 小时前
磁盘I/O瓶颈排查:面试通关“三部曲”心法
面试·职场和发展
Musennn12 小时前
leetcode 15.三数之和 思路分析
算法·leetcode·职场和发展
MarkHard12317 小时前
Leetcode (力扣)做题记录 hot100(62,64,287,108)
算法·leetcode·职场和发展
爱上彩虹c1 天前
LeetCode Hot100 (1/100)
算法·leetcode·职场和发展
小陈的进阶之路1 天前
计算机大类专业数据结构下半期实验练习题
数据结构·算法·深度优先
不会计算机的捞地1 天前
【数据结构入门训练DAY-30】数的划分
数据结构·算法·深度优先
程序员三藏1 天前
软件测试之功能测试详解
自动化测试·软件测试·python·功能测试·测试工具·职场和发展·测试用例