CSDN 编程竞赛二十期题解

竞赛总览

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

竞赛题解

题目1、非降序数组

写一个函数,传入两个非降序的整数数组(A, B),将A, B合并成一个非降序数组C,返回C(不要使用内置sort函数)。

#include 

int data [100005];

int main () {
    int n, m;
    scanf ("%d %d", &n, &m);
    int t = n + m;
    for (int i = 0; i < t; i++) scanf ("%d", &data [i]);
    for (int i = 0; i < t; i++) {
        for (int j = i + 1; j < t; j++) {
            // 冒泡排序
        }
    }
    for (int i = 0; i < t; i++) {
        if (i > 0) printf (" ");
        printf ("%d", data [i]);
    }
    return 0;
}

都说了不要使用内置sort函数,你可真听话啊!

所以也可以直接用 std::sort (data, data + n) 代替冒泡排序,简单粗暴。

题目2、吃!吃!吃!

已知n个整数。每3个数算一个周期。不足一个周期补0。

在周期的第一个位置的数的权值和等于a1+a[1+3]+…

第二个位置的数的权值和等于a2+a[2+3]+…

求三个数的最大权值。如果最大权值为第一个数,输出’J’;最大权值为第二个数,输出’H’;最大权值为第三个数,输出’B’。

#include 
#include 

int data [3];

int main () {
    int result = 0;
    int n;
    scanf ("%d",&n);
    for (int i = 0; i < n; i++) {
        int x;
        scanf ("%d", &x);
        data [i % 3] += x;
    }
    std::string str = "JHB";
    if (data [1] >= data [0] && data [1] >= data [2]) result = 1;
    else if (data [2] >= data [0] && data [2] >= data [1]) result = 2;
    return 0;
}

通过下标对三取余来实现三个列表分别求和的操作,使用一个数组存储求和结果。

之后取出最大值对应的下标,映射到结果(JHB)的对应位置输出即可。

题目3、计算逆波兰表达式的结果

逆波兰记法中,操作符置于操作数的后面。例如表达“三加四”时,写作“3 4 +”,而不是“3 + 4”。如果有多个操作符,操作符置于第二个操作数的后面,所以常规中缀记法的“3 - 4 + 5”在逆波兰记法中写作“3 4 - 5 +”:先3减去4,再加上5。使用逆波兰记法的一个好处是不需要使用括号。例如中缀记法中“3 - 4 * 5”与“(3 - 4) * 5”不相同,但后缀记法中前者写做“3 4 5 * -”,无歧义地表示“3 (4 5 *) -”;后者写做“3 4 - 5 *”。

#include 
#include 
#include 
#include 

int main () {
    std::stack st;
    std::string str;
    while (std::cin >> str) {
        bool isNumber = match (str);
        if (isNumber) st.push (toInt (str));
        else {
            long long int x = st.top (); st.pop ();
            long long int y = st.top (); st.pop ();
            if (str [0] == '+') st.push (x + y);
            else if (str [0] == '-') st.push (x - y);
            else if (str [0] == '*') st.push (x * y);
            else if (str [0] == '/') st.push (x / y);
            else if (str [0] == '%') st.push (x % y);
        }
    }
    long long int result = st.top (); st.pop ();
    printf ("%lld", result);
    return 0;
}

逆波兰表达式的用法很简单。对输入进行判断,将其划分为操作数和运算符两种情况。

操作数直接扔到栈中,遇到双目运算符(二元运算符)时,从栈顶取出两个数字进行运算即可。

运算时,需要特别注意减法等对操作数顺序有要求的运算,其它的运算直接无脑A op B即可。

使用样例 3 4 5 * - 发现答案差了一个符号,好像是题目的问题,直接交换x和y的值就可以通过这道题了。

题目4、会议安排

开会了!作为一个集体,开会的时候桌子当然是需要和老大相邻的(老大可能坐在桌子上边)!小艺被分配到排桌椅的活,可是小艺的力气都用在吃上了,怎么可能搬动这些桌椅呢。她决定用现有的布局当作是会议座位安排。每个桌子分配一个 人。互相连接相同字符表示一个桌子,如UVV表示2张桌子,UVU则表示3张桌子。小艺想知道选择某个桌子之后老大身边能围多少人?

试了一下,答案范围并不是很大,果断开启骗分模式,快速通过。

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