💥前言
刷刷刷
😉解题报告
💥纸张尺寸
☘️ 题目描述☘️
🤔一、思路:
(1)模拟
😎二、代码:
#include <iostream>
using namespace std;
int main() {
int n = 0, d = 1189, x = 841;
scanf("A%d", &n);
for (int i = 0; i < n; i++) {
int t = d;
d = x;
x = t / 2;
}
printf("%d\n%d", d, x);
return 0;
}
💥最大数字
☘️ 题目描述☘️
🤔一、思路:
(1)按照执梗老大的思路写的,自己不会专门复习了下暴搜dfs,执梗老大的题解
(2)贪心+bfs,从最大位数开始进行操作,操作之后对下一位的数进行递归直至一轮递归结束进行取最大值,将所有结果取一遍取最大值进行输出;
😎二、代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 100;
char nums[N];
int a, b;
LL ans = 0;
// 操作1 ++ , 操作2 --,
// 先操作1,每次操作 操作,选取合适的增加数 t = min(t, 9 - x),(i + 1, v + 9)完之后进行回溯,
// 若操作2的操作数大于当前位置的数的 进行操作为 (i + 1, v + 9);
// 回溯之后进行对比
void dfs(int i, LL v) {
int x = nums[i] - '0';
if (nums[i]) {
//为当前位置取所能加的最大值
int t = min(a, 9 - x);
a -= t;
// 若m大于x,则可让当前位置为最大值9
dfs(i + 1, v*10 + x + t);
a += t;
if (x < b) {
b -= x + 1;
dfs(i + 1, v * 10 + 9);
b += x + 1;
}
}else {
ans = max(ans, v);
}
}
int main() {
scanf("%s%d%d", nums, &a, &b);
dfs(0,0);
printf("%lld", ans);
return 0;
}