CSDN 编程竞赛十三期题解

竞赛总览 

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

这次竞赛感觉全是原题,题目设置不太合理。 

竞赛题解

题目1、陶陶摘苹果

陶陶家的院子里有一棵苹果树,每到秋天树上就会结出10个苹果。苹果成熟的时候,陶陶就会跑去摘苹果。陶陶有个30厘米高的板凳,当她不能直接用手摘到苹果的时候,就会踩到板凳上再试试。现在已知10个苹果到地面的高度,以及陶陶把手伸直的时候能够达到的最大高度,请帮陶陶算一下她能够摘到的苹果的数目。假设她碰到苹果,苹果就会掉下来。

NOIP上古原题。纯签到题,有手就行。

输入10个苹果的高度和最大高度,再加上板凳高度,得到实际最大高度。

使用一层循环,逐个对每个苹果进行检查,如果能摘到苹果,给答案+1即可。

题目2、硬币的面值

小A有n枚硬币,现在要买一样不超过m元的商品,他不想被找零,同时又不想带太多的硬币,且硬币可以重复,现在已知这n枚硬币的面值,请问最少需要多少枚硬币就能组合成所有可能(即能组合成1-m任意之间的数字)的价格?

洛谷原题。

输入硬币面值之后排序,看看有没有面值为1的硬币,没有的话输出无解。后面可以用贪心实现。

题目3、公司新表

公司里为了凸显公司的特性。安装了一个n进制表。 已知新的表的时间是“H:M”。时间合法的定义为H<=23 && M<=59。时间有多少种进制定义的方式,依次打印出来。如果有无数种解输出“-1”,不存在输出“0”。

如果时间为12:01,那么n进制中必须有符号能到达2,因此至少为3进制。

如果时间有9,至少为10进制。

可以编写一个验证指定进制是否合理的函数,然后逐个对2到60进制进行测试。

bool match (std::string str, int n) {
    int t [2] = {0, 0}, idx = 0;
    for (int i = 0; i < str.length (); i++) {
        if (str [i] != ':') {
            int base = (str [i] >= '0' && str [i] <= '9') ? str [i] - '0' : str [i] - 'A' + 10;
            if (base >= n) return false;
            else t [idx] = t [idx] * n + base;
        } else {
            idx = 1;
        }
    }
    return t [0] < 24 && t [1] < 60;
}

没有符合条件的进制数时,输出0;

时间能被60进制表示时,有无数多组解,输出-1;

否则,按顺序输出符合条件的进制数即可。

题目4、小豚鼠排排坐

小艺酱买了一个由一排排格子组成的小房子n*m,她想让k个小豚鼠每个小豚鼠都有自己的格子。但是为了不浪费空间,她想要最边角的一圈2*(n+m-2)每行每列的格子都有一个小豚鼠居住。具体来说,假设这k只小豚鼠的格子坐标为(x1, y1), (x2, y2),…,(xk, yk),则需要满足存在1

这个也是原题,忘记在哪里见到过了。

通过动态规划逐个安排小豚鼠,然后写个检测函数,判断其中有没有符合条件的状态。

如果四个状态都满足条件,就将这种方案纳入总方案中。

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