目录
问题 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)