• HNUCM-2022年秋季学期《算法分析与设计》练习15


    目录

    问题 A: X星人的地盘

    问题 B: X星人的递归

    问题 C: X星人的礼物

    问题 D: X星人的股票


    问题 A: X星人的地盘

    题目描述

    一天,X星人和Y星人在一张矩形地图上玩抢地盘的游戏。
    X星人每抢到一块地,在地图对应的位置标记一个“X”;Y星人每抢到一块地,在地图对应的位置标记一个“Y”;如果某一块地无法确定其归属则标记一个“N”。
    最终统计谁拥有的地盘最大,即统计“X”和“Y”的个数。如果“X”的个数多,则说明X星人的地盘更大,输出“X win”;反之,如果Y星人的地盘更大,则输出“Y win”;如果X星人和Y星人拥有的地盘一样大,则输出“The same”。

    输入

    单组输入。
    第1行输入两个正整数m和n,表示地图矩阵的行和列。(m和n均不超过1000)
    从第2行到第m+1行,输入一个由'X'、'Y'和'N'三种字符组成的矩阵,每行包含n个字符,一共m行。

    输出

    如果X星人拥有的地盘大,输出“X win”;如果Y星人拥有的地盘大,输出“Y win”;如果拥有的地盘一样大,输出“The same”。

    思路:简单题,就是数数,但是数据应该有点小问题,不适用python和java的一般输入,会导致wa。改用多组输入的方式循环输入即可解决。

    1. x, y = 0, 0
    2. while True:
    3. try:
    4. string = input()
    5. x, y = x + string.count('X'), y + string.count('Y')
    6. except:
    7. break
    8. print('X win') if x > y else print('Y win') if y > x else print('The same')

    问题 B: X星人的递归

    题目描述

    X星人想使用递归编写一个程序求如下表达式的计算结果:  (1 S(n) = 1 -  4 + 9 - 16 + 25 - 36 +......
    输入n,输出表达式S(n)的结果。
    请你编写一个递归程序帮助X星人实现该功能。

    输入

    单组输入,输入一个正整数n,1

    输出

    输出表达式S(n)的计算结果。

    思路:简单题,直接用递归的话,注意递归深度。

    1. import sys
    2. sys.setrecursionlimit(1000000)
    3. def fun(x: int):
    4. if x == 1:
    5. return 1
    6. else:
    7. t = -1 if x % 2 == 0 else 1
    8. return fun(x - 1) + t * (x ** 2)
    9. n = int(input())
    10. print(fun(n))

    问题 C: X星人的礼物

    题目描述

    六一儿童节到了,X星人宝宝收到了很多很多礼物。他决定把这些礼物装到自己的礼物箱中。为此,他准备了很多个型号相同的礼物箱,每个礼物箱能够装礼物的最大重量都是一样的。但是X星人宝宝不希望在一个礼物箱里面装太多礼物(可能担心礼物会被压坏吧),每个礼物箱最多只允许装2个礼物
    假设X星人宝宝收到了N个礼物,现在给出每一个礼物的重量和一个礼物箱的最大装载量,请你编写一个程序计算X星人宝宝最少要用多少个礼物箱才能够把所有的礼物都装完

    输入

    单组输入。
    每组两行,第1行输入两个正整数,分别表示礼物的数量N和每个礼物箱的最大装载量C,其中1<=N<=1000,1<=C<=100,两者之间用英文空格隔开。
    第2行输入N个不超过100的正整数,分别表示每一个礼物的重量,两两之间用英文空格隔开。
    输入保证最重的礼物的重量<=C。

    输出

    针对所输出的数据,输出将所有的礼物全部都装完所需的礼物箱的最少个数。

    思路:对礼物的重量进行排序,从首尾开始选取礼物放入盒中,如果礼物的重量小于等于c,两者都放入盒中,否则只有最重的礼物放入盒中。

    1. n, c = map(int, input().split())
    2. goods, cnt = [int(i) for i in input().split()], 0
    3. i, j, _ = 0, n - 1, goods.sort()
    4. while i < j:
    5. if goods[i] + goods[j] <= c:
    6. cnt, i, j = cnt + 1, i + 1, j - 1
    7. else:
    8. cnt, j = cnt + 1, j - 1
    9. print(cnt) if i != j else print(cnt + 1)

    问题 D: X星人的股票

    题目描述

    X星人最近迷上了炒股,他炒股有个习惯,每次看到股票跌的时候就会买入
    现在给出某只股票一段时间的股价,假如该股票每天最多只能买入一次,请你编写一个程序计算X星人最多可以买入几次该股票

    输入

    单组输入。
    第1行输入一个正整数N表示某股票股价连续交易的天数。(1<=N<=1000)
    第2行输入N个正整数表示该股票在N个连续交易日的股价,两两之间用英文空格隔开。(扩展知识:交易日是指股票交易发生的时间。常见的交易日时间是周一至周五,另外法定节假日和周末,股票市场和基金市场都是休市的。)

    输出

    请输出X星人最多可以买入股票的次数(不考虑第1次买入,只考虑中间买入的次数)。

    思路:其实就是一个最长下降子序列的题目,只是题意不好理解。

    1. n = int(input())
    2. nums, d = [int(i) for i in input().split()], [1] * n
    3. for i in range(1, n):
    4. for j in range(i):
    5. if nums[i] < nums[j] and d[i] < d[j] + 1:
    6. d[i] = d[j] + 1
    7. print(max(d) - 1)
  • 相关阅读:
    TSINGSEE青犀AI智能分析网关V4酿酒厂安全挂网AI检测算法
    【物理】不脱离外圆面问题
    外贸SEO外链类型有哪些?外链建设如何做?
    springboot基于JAVA的学员代言人评选投票系统设计与实现毕业设计源码161825
    修改 git 默认编辑器
    栈题目:解析布尔表达式
    第十一章:Java对象内存布局和对象头
    第01章 Tableau数据可视化概述
    C#对象序列化
    SLAM从入门到精通(lidar数据的采集)
  • 原文地址:https://blog.csdn.net/weixin_52470573/article/details/128189233