能做到的吧
题目描述
运行代码
#include <iostream>
#include <string>
using namespace std;
string findMax(string s) {
int n = s.length();
string ans = s;
for (int i = 0; i < n; i++) {
for (int j = i + 1; j < n; j++) {
swap(s[i], s[j]);
if (s > ans) ans = s;
swap(s[i], s[j]);
}
}
return ans;
}
int main() {
int t;
cin >> t;
while (t--) {
string x;
cin >> x;
string maxN = findMax(x);
if (maxN > x) {
cout << "YES" << endl;
} else {
cout << "NO" << endl;
}
}
return 0;
}
代码思路
一、整体思路
- 定义了一个函数
findMax
,用于在给定的字符串中通过交换字符找到可能的最大字符串。 - 在
main
函数中,首先读取测试用例的数量t
。 - 对于每个测试用例,读取一个字符串
x
,调用findMax
函数找到x
经过字符交换后的最大字符串maxN
。 - 比较
maxN
和x
,如果maxN
大于x
,输出"YES"
,否则输出"NO"
。
二、各个部分的原理
-
findMax
函数:- 首先获取输入字符串
s
的长度n
,并初始化结果字符串ans
为原始字符串s
。 - 然后通过两层嵌套的循环遍历字符串中的每一对不同的字符位置
i
和j
。 - 在循环中,先交换
s[i]
和s[j]
,然后检查交换后的字符串是否比当前的最大字符串ans
更大。如果是,更新ans
为交换后的字符串。 - 最后再将交换的字符换回来,以保证不改变原始字符串
s
的状态,继续尝试下一对字符的交换。
- 首先获取输入字符串
-
main
函数:- 读取测试用例数量
t
,以便进行多次测试。 - 对于每个测试用例,读取字符串
x
,调用findMax
函数找到最大可能的字符串maxN
。 - 通过比较
maxN
和x
的大小来判断是否可以通过交换字符使字符串变得更大。如果可以,说明存在一种交换方式能得到比原字符串更大的字符串,输出"YES"
;否则输出"NO"
。
- 读取测试用例数量
总的来说,这段代码的目的是判断给定的字符串是否可以通过交换两个字符得到一个更大的字符串,通过暴力枚举所有可能的字符交换情况来找到最大的结果。
好好好数
题目描述
运行代码
#include <iostream>
using namespace std;
int main() {
int t;
cin >> t;
while (t--) {
long long n, k;
cin >> n >> k;
if (n < k) {
cout << n << endl;
} else if (k == 1) {
cout << 1 << endl;
} else {
long long maxx = 0;
while (n > 0) {
maxx = max(maxx, n % k);
n /= k;
}
cout << maxx << endl;
}
}
return 0;
}
代码思路
一、整体思路
- 首先从输入中读取测试用例的数量
t
。 - 对于每个测试用例,读取整数
n
和k
,代表小苯的数字和k -
好数的基数k
。 - 根据不同的条件计算并输出将
n
表示为最少k -
好数之和的数量。
二、各个部分的原理
-
条件判断一:
n < k:
如果n
小于k
,直接输出n
。因为在这种情况下,n
本身无法表示为k
的整数次幂之和,所以最少需要n
个数字1
来表示,即输出n
。 -
条件判断二:
k == 1:
如果k
等于1
,输出1
。因为当k
为1
时,无论n
是多少,都只需要一个数字n
就能表示,所以输出1
。 -
一般情况:
n >= k
且k!= 1
- 初始化
maxx
为0
,用于记录在以k
为基数进行操作过程中的最大余数。 - 使用一个循环,不断对
n
进行除以k
的操作,同时在每次操作中计算n
对k
取余的结果,并更新maxx
为当前最大的余数。 - 最终输出
maxx
。这个过程的原理是通过不断除以k
,模拟以k
为基数进行的一系列操作,在这个过程中记录下最大的余数。这个最大余数代表了一个无法再用更高次幂的k
的整数次幂之和来表示的部分,所以需要单独作为一个k -
好数。而其他部分可以用尽可能少的k
的整数次幂之和来表示。因此,输出的maxx
就是将n
表示为最少k -
好数之和的数量。
- 初始化
好好好数组
题目描述
运行代码
#include <iostream>
using namespace std;
long long read() {
long long x = 0;
int f = 0, ch = 0;
while (ch < 48 || ch > 57)
f = (ch == '-'), ch = getchar();
while (ch > 47 && ch < 58)
x = (x << 3) + (x << 1) + (ch & 15), ch = getchar();
return f? -x : x;
}
void write(long long x, char end = '\n') {
if (x == 0) {
putchar('0');
putchar(end);
return;
}
if (x < 0) putchar('-'), x = -x;
int ch[40] = {0}, cnt = 0;
while (x) {
ch[cnt++] = x % 10;
x /= 10;
}
while (cnt--) putchar(ch[cnt] + 48);
putchar(end);
}
void solve() {
int n = read(), m = read();
if (m <= 1) {
write(n + 1);
return;
}
if (m == 2) {
write(n);
return;
}
if (m == 3) {
write(1);
return;
}
cout << "0" << endl;
}
int main() {
int T = read();
while (T--) solve();
return 0;
}
代码思路
一、整体思路
- 定义了读取整数的函数
read
和输出整数的函数write
。 - 在
solve
函数中,根据输入的n
和m
的不同情况计算满足条件的数组数量并输出。 - 在
main
函数中,读取测试用例数量T
,然后对每个测试用例调用solve
函数进行处理。
二、各个部分的原理
-
read
函数:- 这个函数用于读取整数输入。它通过逐个读取字符,判断正负号,并将数字字符转换为整数来实现。
- 首先,通过循环跳过非数字字符,同时记录是否有负号。
- 然后,再次循环读取数字字符,将其转换为整数并累加到结果中。
- 最后,根据是否有负号返回相应的整数。
-
write
函数:- 这个函数用于输出整数。
- 如果输入的整数为
0
,直接输出0
。 - 如果整数为负数,先输出负号,然后将其转换为正数进行处理。
- 通过不断取整并将余数存入数组,然后逆序输出数组中的数字来实现整数的输出。
-
solve
函数:根据不同的m
值进行不同的处理:- 当
m > 3
时,找不到满足条件的数组,输出0
。 - 当
m == 3
时,只有一种情况满足条件,即{0, 1, n}
(可以通过验证发现只有这种情况满足a_i = a_{i + 1} % i
的条件),所以输出1
。 - 当
m == 2
时,对于每个数字i
从0
到n
,可以组成数组{0, i}
,满足条件,所以输出n
。 - 当
m <= 1
时,意味着数组中可以只有一个或没有不同的数字。在这种情况下,对于每个数字i
从0
到n
,都可以组成一个满足条件的数组,所以输出n + 1
(包括空数组的情况)。
- 当
总的来说,这段代码通过分析不同的 m
值情况,确定满足给定条件的数组数量。利用对输入的特殊处理函数和根据条件进行分类讨论的方法,解决了这个问题。