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。改用多组输入的方式循环输入即可解决。

x, y = 0, 0
while True:
    try:
        string = input()
        x, y = x + string.count('X'), y + string.count('Y')
    except:
        break
print('X win') if x > y else print('Y win') if y > x else print('The same')

问题 B: X星人的递归

题目描述

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

输入

单组输入,输入一个正整数n,1<n<=1000。

输出

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

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

import sys

sys.setrecursionlimit(1000000)


def fun(x: int):
    if x == 1:
        return 1
    else:
        t = -1 if x % 2 == 0 else 1
        return fun(x - 1) + t * (x ** 2)


n = int(input())
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,两者都放入盒中,否则只有最重的礼物放入盒中。

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

问题 D: X星人的股票

题目描述

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

输入

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

输出

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

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

n = int(input())
nums, d = [int(i) for i in input().split()], [1] * n
for i in range(1, n):
    for j in range(i):
        if nums[i] < nums[j] and d[i] < d[j] + 1:
            d[i] = d[j] + 1
print(max(d) - 1)
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,我可以为您讲解一下 HNUCM 最小生成树(Prim)的算法过程。 首先,Prim 算法是一种贪心算法,用于求解带权无向连通图的最小生成树。下面是具体的算法过程: 1. 选取任意一个顶点作为起点,将其加入到生成树中。 2. 找到与已经加入到生成树中的顶点相邻的所有顶点,并计算它们与生成树的距离。 3. 从这些顶点中选取距离最小的顶点,将其加入到生成树中。 4. 重复步骤2和3,直到生成树中包含了所有的顶点。 在具体实现时,可以使用一个数组来记录每个顶点是否已经加入到生成树中,以及另一个数组来记录每个顶点与生成树的距离。每次选择距离最小的顶点时,可以使用一个最小堆来优化。 至于 HNUCM 最小生成树 Prim 算法的具体实现,可以参考以下代码: ```python import heapq def prim(graph): n = len(graph) visited = [False] * n distance = [float('inf')] * n distance[0] = 0 heap = [(0, 0)] result = 0 while heap: (d, u) = heapq.heappop(heap) if visited[u]: continue visited[u] = True result += d for v, weight in graph[u]: if not visited[v] and weight < distance[v]: distance[v] = weight heapq.heappush(heap, (weight, v)) return result ``` 这段代码实现了 HNUCM 最小生成树 Prim 算法的过程,其中 graph 是一个邻接表表示的带权无向连通图,每个元素是一个二元组 (v, w),表示从节点 u 到节点 v 有一条边权为 w 的边。算法的返回值是最小生成树的总权值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值