题目展示:
给定一个正整数 N 。你可以对 N 的任意一位数字执行任意次以下 2 种操 作:
-
将该位数字加 1 。如果该位数字已经是 9 , 加 1 之后变成 0 。
-
将该位数字减 1 。如果该位数字已经是 0 , 减 1 之后变成 9 。
你现在总共可以执行 1 号操作不超过 A 次, 2 号操作不超过 B 次。 请问你最大可以将 N 变成多少?
思路:输入字符串,转成数组,先确定减数,再确定加数,最后输出
代码:
#include<iostream>
using namespace std;
int main()
{
string figure_1 ;//创建字符串
cin >> figure_1;//输入
int a, b;
cin >> a >> b;
int figure[20] = {0};//创建数组
int y = figure_1.length();//字符串长度
for (int i = 0; i < y; i++)//字符转化成数组
{
figure[i] = figure_1[i] - '0';
}
int m, x;
int c = 0;
int n = 0;
for (int i = 0; i < y ; i++)//遍历数组
{
if (b > 0 && figure[i]-b<0)//确定减数c
{
for (x = 0; x <= b; x++)
{
if (figure[i] + 10 - x == 9)
{
c = x;
figure[i] =9;
}
}
b = b - c;
}
if (a > 0 && figure[i] != 9)//确定加数n
{
for (m = 0; m <= a; m++)
{
if (m + figure[i] <= 9)
{
n = m;
}
}
figure[i] = figure[i] + n;
a = a - n;
}
}
for (int i = 0; i < y; i++)
{
cout << figure[i];
}
cout << endl;
}
结论:检测通过70%. //我要发疯啊啊啊啊啊啊啊啊,什么鬼东西 冷静冷静,一搜,吧啦吧啦算法,好的,开学(微笑,微笑)啊哈哈哈哈哈哈哈(阴暗爬行,爬行)(发疯)
先学个DFS玩玩
非常好,根本学不会,好的,不能内耗,先背吧(笑脸)
输入一个数字n,然后得到1到n所有数的排列
const int N = 10;
int ans[N];
bool mark[N];
int n;
void dfs(int u)
{
//"回头"的条件
if (u == n)
{
for (int i = 0; i < n; i++)
{
cout << ans[i] << " ";
}
puts("");
return;
}
for (int i = 1; i <= n; i++)
{
if (mark[i] == 0)
{
mark[i] = 1;
ans[u] = i;
dfs(u + 1);
//复原
mark[i] = 0;
ans[u] = 0;
}
}
}
int main()
{
cin >> n;
dfs(0);
return 0;
}
理解不来一点, 但是大致框架是这样的
先理解两天,过两天写emmm