CSDN 编程竞赛十八期题解

竞赛总览

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

感觉这次竞赛的题目有点偏数学了,尤其是第三道题,输入+输出就完事了,答案是一个数学公式。

竞赛题解

题目1、单链表排序

单链表的节点定义如下(C++):class Node { public: int element; Node* next; }。实现如下函数:Node* sort (Node* head),排序以head为头结点的单链表,返回排序后列表的head节点;只能修改next指针,要求时间复杂度和空间复杂度尽可能优化。

这道题写得挺邪乎,实际上和链表一毛钱关系也没有。

直接输入数据,升序排序之后再输出即可。

#include 
#include 

int main () {
    int n;
    scanf ("%d", &n);
    int data [n];
    for (int i = 0; i < n; i++) scanf ("%d", &data [i]);
    std::sort (data, data + n);
    return 0;
}

题目2、合并二叉树

已知两颗二叉树,将它们合并成一颗二叉树。合并规则是:都存在的结点,就将结点值加起来,否则空的位置就由另一个 树的结点来代替。例如:两颗二叉树是: Tree 1 [1 / 3 2 / 5],Tree 2 [2 / 1 3 4 7],合并后的树为Tree 3 [3 / 4 5 / 5 4 7]。

这道题看似是二叉树的合并问题,如果真的按照题目描述去模拟,那就要写一阵了。

实际上,如果耐心分析一下,便可以找到这道题的窍门。

二叉树给数据的时候是从上到下,逐层给出的。上一层的数据给完,才会给下一层的数据。

这时候读入数据可以当满二叉树来读(除了最后一层)。

而且题目也说了,如果中间节点是空的会输入一个null,不会直接跳过。

所以只要把二叉树当成一个一维数组读进来就可以了。

处理的时候也同理,对应位置直接相加即可。

这样的话树就转化成一个线性表了,操作会简便不少。

#include 
#include 

int dp [1005][2];

int max (int a, int b) {
    if (a > b) return a;
    return b;
}

int main () {
    scanf ("%d %d", &dp [0][0], &dp [0][1]);
    for (int i = 1; i < 1005; i++) {
        dp [i][0] = dp [i][1] = -1;
    }
    for (int t = 0; t < 2; t++) {
        for (int i = 1; i <= dp [0][t]; i++) {
            std::string str;
            std::cin >> str;
            dp [i][t] = toInt (str);
        }
    }
    for (int i = 1; i <= max (dp [0][0], dp [0][1]); i++) {
        if (i > 1) printf (" ");
        if (dp [i][0] == -1 && dp [i][1] == -1) printf ("null");
        else if (dp [i][0] == -1) printf ("%d", dp [i][1]);
        else if (dp [i][1] == -1) printf ("%d", dp [i][0]);
        else printf ("%d", max (dp [i][0], dp [i][1]));
    }
    return 0;
}

题目3、n边形划分

已知存在n边形。连接多边形所有对角线,能形成多少区域。

这道题目可以用排列组合的原理推出来,答案是一个公式。

但是,不知道为什么,一直在卡数据,显示通过0%。

4边形能分成4个区域。5边形能分成11个区域(样例也有这个,但是测试数据好像没有)。

弄了半小时还没解决,公式不论是否展开,一律0%。

最后换了一种语言,一下就过了。很懵。

题目4、开心的金明

金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间他自己专用的很宽敞的房间。更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过N元钱就行”。今天一早金明就开始做预算,但是他想买的东西太多了,肯定会超过妈妈限定的N元。于是,他把每件物品规定了一个重要度,分为5等:用整数1-5表示,第5等最重要。他还从因特网上查到了每件物品的价格(都是整数)。他希望在不超过N元(可以等于N元)的前提下,使每件物品的价格与重要度的乘积的总和最大。设第j件物品的价格为v [j],重要度为w [j],共选中了k件物品,编号依次为1, 2, …, k,则所求的总和为:v [1] * w [1] + v [2] * w [2] + … + v [k] * w [k]。请你帮助金明设计一个满足要求的购物单。

背包问题。代码不放了,如果对这道题目感兴趣可以自己到网上查找背包九讲的教程,这份教程讲述了各种背包问题的解法。

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