CSDN 编程竞赛二十一期题解

竞赛总览

CSDN 编程竞赛二十一期:比赛详情 (csdn.net)

竞赛题解

题目1、合并序列

有N个单词和字符串T,按字典序输出以字符串T为前缀的所有单词。

#include 
#include 
#include 
#include 
#include 

bool match (std::string str1, std::string str2) {
    if (str1.length () < str2.length ()) return false;
    int result = 0;
    while (result < str2.length ()) {
        if (str1 [result] != str2 [result]) break;
        result = result + 1;
    }
    return result == str2.length ();
}

int main () {
    std::vector result;
    int n;
    scanf ("%d", &n);
    std::string str [n + 1];
    for (int i = 1; i <= n; i++) std::cin >> str [i];
    std::cin >> str [0];
    int t = 0;
    for (int i = 1; i <= n; i++) {
        if (match (str [i], str [0])) {
            result.push_back (str [i]);
        }
    }
    std::sort (result.begin (), result.end ());
    return 0;
}

题目2、千问万问

给定大小为n的整数序列A。现在会有q次询问,询问子区间的整数数量。 

测试数据有问题,每个测试数据又存在多组询问,因此骗分也没成功,于是果断放弃此题。

题目3、连续子数组的最大和

给定一个整数数组nums,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

题目4、降水量

给定n个柱面的高度,表示降雨某地n块区域的海拔高度。计算降雨之后该地最大储水面积。如果低于地平线,也就是小于0,则一定积水。

之前的竞赛考过一次二维降水题目,这次又出现一道一维降水题目。

两道题都是初级题目,但从难度上看,由于此题是一维的,因此比那道二维积水题目简单很多。

如果积水量小于0,要先变成0。最好是在输入数据时直接处理:遇到小于0的情况,将地下部分累积到总积水量中,再将数据直接改成0,方便后续计算。

for (int i = 0; i < n; i++) {
    int x = 0; for (int j = i; j >= 0; j--) if (x < data [j]) x = data [j];
    int y = 0; for (int j = i; j < n; j++) if (y < data [j]) y = data [j];
    result = result - data [i] + (x < y ? x : y);
}

处理完地下部分的积水量之后,套用上述代码对地上部分的积水量进行统计即可。

你可能感兴趣的:(CSDN,竞赛题解,算法,c++)