首页 > 其他分享 >(贪心+搜索+剪枝)P8801 [蓝桥杯 2022 国 B] 最大数字

(贪心+搜索+剪枝)P8801 [蓝桥杯 2022 国 B] 最大数字

时间:2023-06-05 11:24:34浏览次数:40  
标签:剪枝 P8801 int res dfs 蓝桥 num now

题目描述

给定一个正整数 N。你可以对 N 的任意一位数字执行任意次以下 2 种操作:

  1. 将该位数字加 1。如果该位数字已经是 9,加 1 之后变成 0。

  2. 将该位数字减 1。如果该位数字已经是 0,减 1 之后变成 9。

你现在总共可以执行 1 号操作不超过 A 次,2 号操作不超过 B 次。

请问你最大可以将 N 变成多少?

输入格式

第一行包含 3 个整数:N,A,B 。

输出格式

一个整数代表答案。

输入输出样例

输入 #1
123 1 2
输出 #1
933

大体思路:我一开始想的是一层一层的搜索,每次都是迭代循环,然后修改了一下字符类型,搜索完成之后交了一下,60分

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 string s,res;
 4 int a,b;
 5 void dfs(string now,int a,int b,int num)
 6 {
 7     res=max(res,now);
 8     if(num>now.size()) return;//剪枝
 9     if(a==0&&b==0) return;//剪枝
10     while(now[num]-'0'==9) num++;//如果有9就跳过
11     if(now[num]-'0'<9)
12     {
13         if(now[num]=='0'&&b>=1) now[num]='9',dfs(now,a,b-1,num);//特判
14         else
15         {
16             if(a>=1) now[num]+=1,dfs(now,a-1,b,num),now[num]-=1;
17             if(b>=1) now[num]-=1,dfs(now,a,b-1,num),now[num]+=1;
18         }
19     }
20 }
21 int main()
22 {
23     cin>>s;
24     cin>>a>>b;
25     dfs(s,a,b,0);
26     cout<<res;
27     return 0;
28 }

很明显,由于A,B的数据范围是0-100,10x6复杂度肯定是tle了两个点,还有两个是答案错误

后来在题解中,我发现这里面的贪心思路不仅仅是每次迭代循环让数字变成9,而是一次性变,大大减小了搜索次数

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 string res,s;
 4 int a,b;
 5 void dfs(string now,int a,int b,int num)//现在是多少,a的次数,b的次数,现在的位置
 6 {
 7     res=max(res,now);//每次更新
 8     if((a==0&&b==0)||num==now.size()) return;//剪枝返回
 9     int u=now[num]-'0';//挑出来这次的数字
10     if(a+u>=9) now[num]='9',dfs(now,a-9+u,b,num+1);//a+u>=9的意思是,我这个位可以加一定次数可以到9,并且这个次数<=a
11     if(b>=u+1) now[num]='9',dfs(now,a,b-u-1,num+1);//与a同理
12     if(a+u<9&&b<u+1) now[num]=u+a+'0',dfs(now,0,b,num+1);//如果都不行,把这一位全加上,有可能下一位减b还会变成9,要继续搜
13 }
14 int main()
15 {
16     cin>>s>>a>>b;
17     dfs(s,a,b,0);
18     cout<<res;
19     return 0;
20 }

 

 

标签:剪枝,P8801,int,res,dfs,蓝桥,num,now
From: https://www.cnblogs.com/o-Sakurajimamai-o/p/17457334.html

相关文章

  • 【蓝桥杯集训·每日一题】AcWing 3805. 环形数组
    写在前面本人CSDN博客主页:这里一、题目1、原题链接3805.环形数组2、题目描述给定一个长度为n的环形数组a0,a1,…,an−1。现在要对该数组进行m次操作。操作分为以下两种:增值操作lrd,将区间[l,r]上的每个元素都增加d。求最小值操作lr,输出区间[l,r]内的所有元素的最小......
  • 蓝桥杯----动态规划训练
    最长上升子序列 之前我定义的dp是:dp[n][i]:表示在前n个数中选,并以数a[i]结尾的最长上升序列但是这个状态的转移有点不自然,感觉就想有很多多余的感觉if(i<=n-1)dp[n][i]=dp[n-1][i]if(a[i]>a[j]&&j<=n-1)dp[n][i]=max(dp[n][i],dp[......
  • 第十届蓝桥杯c++b组国赛题解(还在持续更新中...)
    试题A:平方序列解题思路:直接枚举一遍x的取值,然后按照题目给定的式子算出y,每次取x+y的最小值即可答案为7020代码实现:#include<iostream>#include<algorithm>#include<cmath>usingnamespacestd;#defineintlonglongconstintN=1e4+5;signedmain(){ //记录答案......
  • 蓝桥WP
    CyberChef可以看出是先将flagbase64加密一下然后ROT13加密先手动爆破出ROT13得ZmxhZ3tkY2I3N2FiYy02NDQ1LTQ4NDAtYmJjYS01MjUyZjYwNzM1ZTd9然后base64解密得flagflag{dcb77abc-6445-4840-bbca-5252f60735e7}XORIDA64打开,一眼小端序和循环异或key为SEcRET7,写个脚本fl......
  • 【蓝桥杯集训·每日一题】AcWing 1079. 叶子的颜色
    写在前面本人CSDN博客主页:这里一、题目1、原题链接1079.叶子的颜色2、题目描述给一棵有m个节点的无根树,你可以选择一个度数大于1的节点作为根,然后给一些节点(根、内部节点、叶子均可)着以黑色或白色。你的着色方案应保证根节点到各叶子节点的简单路径上都至少包含一个有色节点,哪......
  • 2016第七届蓝桥杯国赛决赛c/c++本科B组试题总结及解题答案
    未完待更新........1.一步之遥从昏迷中醒来,小明发现自己被关在X星球的废矿车里。矿车停在平直的废弃的轨道上。他的面前是两个按钮,分别写着“F”和“B”。小明突然记起来,这两个按钮可以控制矿车在轨道上前进和后退。按F,会前进97米。按B会后退127米。 透过昏暗的灯光,小明看......
  • 蓝桥杯----图论训练
    STL当想要维护一个数组,其中的元素要求有序,同时可能随时对这个数组中的元素进行增减有没有一个STL可以快速维护一个这样的数组?multiset(平衡二叉树) 默认从小到大排序注意离散化中清除重复元素的原理:unique()函数     vector......
  • P9241 [蓝桥杯 2023 省 B] 飞机降落
    题目描述N 架飞机准备降落到某个只有一条跑道的机场。其中第 i 架飞机在 Ti​ 时刻到达机场上空,到达时它的剩余油料还可以继续盘旋 Di​ 个单位时间,即它最早可以于 Ti​ 时刻开始降落,最晩可以于 +Ti​+Di​ 时刻开始降落。降落过程需要 Li​ 个单位时间。一架飞机......
  • 从蓝桥杯来谈Fibonacci数列
    2014年蓝桥杯的第九题是这样描述的:     给定Fibonacci数列F[],其中,,求表达式      的值。其中在讲解这道题之前,我们先来看一个简单版的。题目如下:题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1194分析:可以看出本题就是直接求,虽然这里的......
  • [蓝桥杯 2022 省 B] 扫雷
    [蓝桥杯2022省B]扫雷题目描述小明最近迷上了一款名为《扫雷》的游戏。其中有一个关卡的任务如下,在一个二维平面上放置着 n 个炸雷,第 2023-05-31i 个炸雷 (,,)(xi​,yi​,ri​) 表示在坐标 (,)(xi​,yi​) 处存在一个炸雷,它的爆炸范围是以半径为 ri​ 的一个圆。......