CSDN编程竞赛第六期题解

本文提供了CSDN编程竞赛中四个典型问题的解决方案,包括字符串匹配、哈希表应用、动态规划等核心算法技巧。通过这些实战案例,读者可以加深对算法的理解并提高编程技能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

CSDN编程竞赛报名地址:https://edu.csdn.net/contest/detail/16
(请不要删掉此地址)

1. 题目名称:严查枪火

        X国最近开始严管枪火。 像是“ak”,“m4a1”,“skr”。都是明令禁止的。 现在小Q查获了一批违禁物品其中部分是枪支。 小Q想知道自己需要按照私藏枪火来关押多少人。 (只有以上三种枪被视为违法)

        根据题意,即要判断给定的字符串是否等于“ak”,“m4a1”,“skr”这三个字符串。

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int n, ans = 0;
    cin >> n;
    for (int i = 0; i < n; ++i)
    {
        string s;
        cin >> s;
        if (s == "ak" || s == "m4a1" || s == "skr")
            ++ans;
    }
    cout << ans << endl;
    return 0;
}

2. 题目名称:鬼画符门

        鬼画符门,每年都会统计自己宗门鬼画符消耗的数量,往年一直是大师兄管理, 但是这次鬼艺接手了, 你能帮鬼艺写一个 程序统计每年消耗数量最多的鬼画符吗?

        根据题意,即要统计出现最多次数的字符串,题目保证出现次数最多的字符串唯一。可以用哈希表统计每个字符串出现的次数,然后遍历哈希表记录出现次数最多的字符串。

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int n;
    cin >> n;
    unordered_map<string, int> ump;
    for (int i = 0; i < n; ++i)
    {
        string s;
        cin >> s;
        ++ump[s];
    }
    int mx = 0;
    string ans = "";
    for (auto it = ump.begin(); it != ump.end(); ++it)
    {
        if (it->second > mx)
        {
            mx = it->second;
            ans = it->first;
        }
    }
    cout << ans << endl;
    return 0;
}

3. 题目名称:收件邮箱

        已知字符串str,str表示邮箱的不标准格式。 其中”.”会被记录成”dot”,”@”记录成”at”。 写一个程序将str转化成可用 的邮箱格式。(可用格式中字符串中除了开头结尾所有”dot”,都会被转换,”at”只会被转化一次,开头结尾的不转化)

        根据题意,需要把输入字符串中的“dot"转换成”.",把“at"转换成”@“,模拟即可。

#include <bits/stdc++.h>
using namespace std;
string s;
int main()
{
    cin >> s;
    int n = s.size();
    string ans = s.substr(0, 1);
    for (int i = 1; i < n; ++i)
    {
        if (i + 3 < n && s[i] == 'd' && s[i + 1] == 'o' && s[i + 2] == 't')
        {
            ans += ".";
            i += 2;
        }
        else
            ans += s[i];
    }
    s = ans;
    n = s.size();
    ans = s.substr(0, 1);
    for (int i = 1, ok = 1; i < n; ++i)
    {
        if (i + 2 < n && ok && s[i] == 'a' && s[i + 1] == 't')
        {
            ok = 0;
            ans += "@";
            ++i;
        }
        else
            ans += s[i];
    }
    cout << ans << endl;
    return 0;
}

4. 题目名称:最长递增的区间长度

        给一个无序数组,求最长递增的区间长度。如:[5,2,3,8,1,9] 最长区间 2,3,8 长度为 3。

         题意要求的是连续区间的长度,但题目没说明递增是严格还是非严格,这里我当作严格递增做了。考虑以位置i结尾的区间的最长递增长度为dp[i],那么若a[i]>a[i-1],则dp[i] = dp[i-1] +1,表示区间左端点在i-1之前;否则dp[i] = 1表示区间[i, i]。

#include <bits/stdc++.h>
using namespace std;
const int maxn = 100010;
int a[maxn], dp[maxn];
int main()
{
    int n;
    cin >> n;
    for (int i = 1; i <= n; ++i)
        cin >> a[i];
    int ans = 0;
    for (int i = 1; i <= n; ++i)
    {
        if (a[i] > a[i - 1])
            dp[i] = dp[i - 1] + 1;
        else
            dp[i] = 1;
        ans = max(ans, dp[i]);
    }
    cout << ans << endl;
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值