牛客竞赛 31 周 A , B , C 题

A. 题目:
        小红拿到了一个字符串,她发现这个字符串可能是她自己的名字 "kou" ,于是想将其替换成小紫的名字 "yukari" 。你能帮帮她吗?

输入描述:
        一个仅由小写英文字母字符串str,长度不超过 10。

输出描述:

        如果这个字符串是"kou",请替换成小紫的名字。否则按原串输出。

题目很简单,只要是输入字符串的等于 “kou” 就好啦,直接上代码

#include<bits/stdc++.h>

using namespace std;

int main() {
    string s;
    cin >> s;
    if (s == "kou") {
         cout << "yukari" << endl;
    } else {
        cout << s << endl;
    }
}

 B. 题目:

        小红拿到了一个正整数 x ,她想知道 x 有多少个不同的素因子,你能帮帮她吗?

输入描述:
        一个正整数 x 。1 ≤ x ≤ 10 ^ 13

输出描述:
         x不同的素因子的数量。

关键代码:
         进入一个循环,初始值为 i = 2,循环条件为 i * i <= x。该循环用于找出 x 的所有质因数。在循环中,首先判断 x 是否能被 i 整除,即 x % i == 0。如果成立,说明 i 是 x 的一个质因数。使用一个内部循环,通过不断除以 i 来将所有连续相等的质因数除掉。这样可以保证统计质因数个数时不重复计算。内部循环结束后,将 res 加 1,表示找到了一个质因数。

for (long long i = 2; i * i <= x; i++) {
        if (x % i == 0) {
            while (x % i == 0) {
                x /= i;
            }
            res++;
        }
    }

最后是 AC 代码(标注版本):

#include<bits/stdc++.h>   // 包含整个标准库,这行代码可以省略

using namespace std;   // 使用标准命名空间

typedef long long ll;   // 定义别名 ll 为 long long

int main() {
    ll x;   // 定义变量 x,类型为 long long
    cin >> x;   // 从标准输入读入一个整数并赋值给 x

    ll res = 0;   // 定义变量 res,并初始化为 0
    for (ll i = 2; i * i <= x; i++) {   // 循环变量 i 从 2 开始,直到 i * i 大于等于 x
        if (x % i == 0) {   // 如果 x 能被 i 整除
            while (x % i == 0) {   // 循环除去 x 中的所有 i 因子
                x /= i;   // 除去一个 i 因子
            }
            res++;   // 记录一个不同的素因子
        }
    }

    if (x > 1) {   // 如果 x 大于 1,说明还存在一个不同的素因子
        res++;
    }

    cout << res << endl;   // 输出结果

    return 0;   // 程序结束,返回 0 表示正常退出
}

C. 题目:
        小红定义一个长度为奇数的字符串的“中值”为中间那个字符。例如 "kou" 的中值是 'o' 。
现在小红拿到了一个字符串,她想知道某个字符是多少个子串的中值。你能帮帮她吗?

输入描述:
        1. 第一行输入一个正整数n和一个英文小写字符 chr 。代表字符串长度和询问的字符。
        2. 第二行输入一个长度为 n 的、仅由小写字母组成的字符串。
        3. 1 ≤ n ≤ 10^5

输出描述:

        一个整数,代表中值为 chr 的连续字串数量

输入样例:

4 b
abcb

输出样例:

3

        这道题的思路是遍历字符串,并记录与给定字符相同的字符出现的位置,然后根据这些位置计算连续子串的数量。

        首先,在 main 函数中声明了变量 n 和 ans,分别用于存储字符串 s 的长度和最终的结果值。还声明了变量 left 和 right,用于记录当前操作字符的左侧和右侧的字符个数。还声明了变量 k 用于存储目标字符。然后,从输入流中读入变量 n 和 k。接着从输入流中读入字符串 s。因为最大值可能是 10 ^ 5,所以需要使用 long long。

long long n, ans = 0, left = 0, right = 0;
char k;
string s;

        接下来,使用一个循环遍历字符串 s 的每个字符。如果当前字符与 k 不相等,将 left 加 1,表示当前字符的左侧字符个数增加 1。否则,表示当前字符与 k 相等,进行一次操作,将 left 加 1,将 ans 加 1,同时计算出当前字符右侧的字符个数 right。根据题意,我们需要选择操作次数较少的一侧继续操作,所以我们将操作次数较少的一侧的字符个数 res 赋给 ans,同时将 ans 加上 res

for (int i = 0; i < s.length(); i++) {
        if (s[i] != k) {
            left++;
        } else {
            int res;
            left++;
            ans++;
            right = s.length() - left;
            if (left - 1 > right) {
                res = right;
            } else {
                res = left - 1;
            }
            ans = ans + res;
        }
    }

        这段代码的时间复杂度是 O(n),其中 n 是字符串 s 的长度。因为循环遍历了字符串 s,所以时间复杂度与字符串长度成正比。

最后附上 AC 代码(外加标注)

#include <bits/stdc++.h>

using namespace std;

int main() {
    // 声明变量
    long long n, ans = 0, left = 0, right = 0;
    char k;
    string s;
    
    // 读取输入
    cin >> n >> k; // 输入字符串长度和目标字符
    cin >> s;      // 输入字符串
    
    // 遍历字符串
    for (int i = 0; i < s.length(); i++) {
        if (s[i] != k) {
            left++; // 当前字符不是目标字符,左侧字符个数加一
        } else {
            int res;
            left++;   // 当前字符是目标字符,左侧字符个数加一
            ans++;    // 操作次数加一
            right = s.length() - left; // 计算右侧字符个数
            
            // 选择操作次数较少的一侧并计算结果
            if (left - 1 > right) {
                res = right;
            } else {
                res = left - 1;
            }
            
            ans = ans + res; // 更新最终结果
        }
    }
    
    // 输出结果
    cout << ans << endl;
    
    return 0;
}

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值