牛客周赛 Round 58(下)

能做到的吧

题目描述

登录—专业IT笔试面试备考平台_牛客网

牛客周赛 Round 58(下)_第1张图片

运行代码

#include 
#include 
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;
}

代码思路

一、整体思路

  1. 定义了一个函数 findMax,用于在给定的字符串中通过交换字符找到可能的最大字符串。
  2. 在 main 函数中,首先读取测试用例的数量 t
  3. 对于每个测试用例,读取一个字符串 x,调用 findMax 函数找到 x 经过字符交换后的最大字符串 maxN
  4. 比较 maxN 和 x,如果 maxN 大于 x,输出 "YES",否则输出 "NO"

二、各个部分的原理

  1. findMax 函数:

    • 首先获取输入字符串 s 的长度 n,并初始化结果字符串 ans 为原始字符串 s
    • 然后通过两层嵌套的循环遍历字符串中的每一对不同的字符位置 i 和 j
    • 在循环中,先交换 s[i] 和 s[j],然后检查交换后的字符串是否比当前的最大字符串 ans 更大。如果是,更新 ans 为交换后的字符串。
    • 最后再将交换的字符换回来,以保证不改变原始字符串 s 的状态,继续尝试下一对字符的交换。
  2. main 函数:

    • 读取测试用例数量 t,以便进行多次测试。
    • 对于每个测试用例,读取字符串 x,调用 findMax 函数找到最大可能的字符串 maxN
    • 通过比较 maxN 和 x 的大小来判断是否可以通过交换字符使字符串变得更大。如果可以,说明存在一种交换方式能得到比原字符串更大的字符串,输出 "YES";否则输出 "NO"

总的来说,这段代码的目的是判断给定的字符串是否可以通过交换两个字符得到一个更大的字符串,通过暴力枚举所有可能的字符交换情况来找到最大的结果。

好好好数

题目描述

登录—专业IT笔试面试备考平台_牛客网

牛客周赛 Round 58(下)_第2张图片

运行代码

#include 
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;
}

代码思路

一、整体思路

  1. 首先从输入中读取测试用例的数量 t
  2. 对于每个测试用例,读取整数 n 和 k,代表小苯的数字和 k -好数的基数 k
  3. 根据不同的条件计算并输出将 n 表示为最少 k -好数之和的数量。

二、各个部分的原理

  1. 条件判断一:n < k:如果 n 小于 k,直接输出 n。因为在这种情况下,n本身无法表示为 k 的整数次幂之和,所以最少需要 n 个数字 1来表示,即输出 n

  2. 条件判断二:k == 1:如果 k 等于 1,输出 1。因为当 k 为 1 时,无论 n 是多少,都只需要一个数字 n就能表示,所以输出 1

  3. 一般情况:n >= k 且 k!= 1

    • 初始化 maxx 为 0,用于记录在以 k 为基数进行操作过程中的最大余数。
    • 使用一个循环,不断对 n 进行除以 k 的操作,同时在每次操作中计算 n 对 k 取余的结果,并更新 maxx 为当前最大的余数。
    • 最终输出 maxx。这个过程的原理是通过不断除以 k,模拟以 k 为基数进行的一系列操作,在这个过程中记录下最大的余数。这个最大余数代表了一个无法再用更高次幂的 k 的整数次幂之和来表示的部分,所以需要单独作为一个 k -好数。而其他部分可以用尽可能少的 k 的整数次幂之和来表示。因此,输出的 maxx 就是将 n 表示为最少 k -好数之和的数量。

好好好数组

题目描述

登录—专业IT笔试面试备考平台_牛客网

牛客周赛 Round 58(下)_第3张图片

运行代码

#include 
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;
}

代码思路

一、整体思路

  1. 定义了读取整数的函数 read 和输出整数的函数 write
  2. 在 solve 函数中,根据输入的 n 和 m 的不同情况计算满足条件的数组数量并输出。
  3. 在 main 函数中,读取测试用例数量 T,然后对每个测试用例调用 solve 函数进行处理。

二、各个部分的原理

  1. read 函数:

    • 这个函数用于读取整数输入。它通过逐个读取字符,判断正负号,并将数字字符转换为整数来实现。
    • 首先,通过循环跳过非数字字符,同时记录是否有负号。
    • 然后,再次循环读取数字字符,将其转换为整数并累加到结果中。
    • 最后,根据是否有负号返回相应的整数。
  2. write 函数:

    • 这个函数用于输出整数。
    • 如果输入的整数为 0,直接输出 0
    • 如果整数为负数,先输出负号,然后将其转换为正数进行处理。
    • 通过不断取整并将余数存入数组,然后逆序输出数组中的数字来实现整数的输出。
  3. 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 值情况,确定满足给定条件的数组数量。利用对输入的特殊处理函数和根据条件进行分类讨论的方法,解决了这个问题。

你可能感兴趣的:(算法)