【站内题解】十六道csdn每日一练Python题解

文章目录


在这里插入图片描述


注:本文内容均整合自站内文章

题目一: 游乐园的门票

1. 问题描述

某游乐园院按照游客身高段收取票价:不到 1.0米 的游客免费; 1.0~1.2 米的游客为 80 元;超过 1.2 米的游客为 150 元。

请编写一个死循环,每次循环开始先使用print()语句一行输出字符串"Please tell me your height!Enter ‘quit’ to end the program."。

如果读取到的字符串等于’quit’,则使用 break 语句退出循环,否则将字符串转成浮点数,如果小于1.0米,则使用print()语句一行输出字符串’Your admission cost is 0 yuan.‘;

如果大于等于1.0米且小于等于1.2米,则使用print()语句一行输出字符串’Your admission cost is 80 yuan.’;
如果大于1.2米,则使用print()语句一行输出字符串’Your admission cost is 150 yuan.‘。

然后本次循环结束,再次进入 while 循环中的条件测试。

2. 输入描述

保证每一行的输入只有浮点数或字符串’quit’,且保证数字合法,范围在[0, 3]。

3. 输出描述

按题目描述进行输出即可。

4. 示例

4.1 输入

0.5
1.2
quit

4.2 输出

Please tell me your height!
Enter ‘quit’ to end the program.

5. 答案

5.1 解法一

while True:
    try:
        print("Please tell me your height!\nEnter 'quit' to end the program.")
        a = input()
        if a == 'quit':
            break
        elif float(a) < 1.0:
            print('Your admission cost is 0 yuan.')
        elif 1.0 < float(a) <= 1.2:
            print('Your admission cost is 80 yuan.')
        else:
            print('Your admission cost is 150 yuan.')
    except:
        break

5.2 解法二

operators_dict = {'<': 'less than','==': 'equal'}
print('Here is the original dict:')

for k in sorted(operators_dict):
    print(f'Operator {k} means {operators_dict[k]}.')
print()    

operators_dict['>'] =  'greater than'
print('The dict was changed to:')

for k in sorted(operators_dict):
    print(f'Operator {k} means {operators_dict[k]}.')

题目二:小桥流水人家

1. 问题描述

在n*m的地图上,存在一个喷水点(x,y). 如果相邻的位置低于有水的地方,水就能流到相邻的某位置。 已知各个地方的海拔高度,求水的最大覆盖个格子数。

2. 输入描述

第一行输入n,m,x,y.(1<=n,m<=1000,1<=x<=n,1<=y<=m) 以下n行每行m个整数,表示每个格子的海拔.(1<=h<=1000)

3. 输出描述

输出最大覆盖格子数

4. 示例

4.1 输入

3 5 2 3
3 4 1 5 1
2 3 3 4 7
4 1 4 1 1

4.2 输出

6

5. 答案

class Solution:
    def __init__(self) -> None:
        pass

    def changshi(self, vector, matrix, n, m, a, b):
        ll = [[-1, 0], [1, 0], [0, -1], [0, 1]]
        for i in range(4):  # 四边寻找 上下右左
            a1 = a + ll[i][0]
            b1 = b + ll[i][1]
            if 0 <= a1 <= n - 1 and 0 <= b1 <= m - 1:
                if vector[a][b] > vector[a1][b1]:  # 若找到
                    matrix[a1][b1] = 1  # 标记位置
                    self.changshi(vector, matrix, n, m, a1, b1)
        return matrix

    def solution(self, n, m, x, y, vector):
        result = 0
        a, b = n - y, x - 1
        matrix = [[0 for i in range(m)] for i in range(n)]
        matrix[n - y][x - 1] = 1
        matrix = self.changshi(vector, matrix, n, m, a, b)
        for i in range(n):
            for j in range(m):
                if matrix[i][j] == 1:
                    result = result + 1
        print(matrix)
        return result

if __name__ == "__main__":
    arr_temp = [int(item) for item in input().strip().split()]
    n = int(arr_temp[0])
    m = int(arr_temp[1])
    x = int(arr_temp[2])
    y = int(arr_temp[3])
    vector = []
    for i in range(n):
        vector.append([int(item) for item in input().strip().split()])
    sol = Solution()
    result = sol.solution(n, m, x, y, vector)
    print(result)

题目三:小艺读书

1. 问题描述

书是人类进步的阶梯。
小艺每周因为工作的原因会选择性的每天多读几页或者少读几页。
小艺想知道一本n页的书她会在周几读完。

2. 输入描述

第一行输入n(1<=n<=1000);
第二行输入7个整数,分别表示周一~周日的读书页数p(0<=p<=1000)。(不考虑7个整数都为0的情况)

3. 输出描述

输出答案。(1-7)

4. 示例

4.1 输入

100
15 20 20 15 10 30 45

4.2 输出

6

5. 答案

class Solution:
	def __init__(self) -> None:
		pass
		
	def solution(self, n, pages):
		result = None
		
		# TODO: 请在此编写代码
		page=sum(pages)
		book=n%page
		for i in range(7):
			book-=pages[i]
			if(book<=0):
				result=i+1
				break
				
		return result
		
if __name__ == "__main__":
	n = int(input().strip())
	
	pages = [int(item) for item in input().strip().split()]
	
	sol = Solution()
	result = sol.solution(n, pages)
	print(result)

题目四:鬼画符门之宗门大比

1. 问题描述

给定整数序列A。

求在整数序列A中连续权值最大的子序列的权值。

2. 输入描述

第一行输入整数n.(1<=n<=1000)
第二行输入n整数a。(-1000<=a<=1000)

3. 输出描述

输出子序列最大权值。

4. 示例

4.1 示例一

4.1.1 输入

5
-1 2 3 -2 4

4.1.2 输出

7

4.2 示例二

4.2.1 输入

7
1 -4 6 7 -10 8 0

4.2.2 输出

11

5. 答案

class Solution:
	def __init__(self) -> None:
		pass
	def solution(self, n, arr):
		result = None
		
		# TODO: 请在此编写代码
		num=[]
		m=0
		for i in arr:
			m+=i
			if m<=0:
				m=0
			else:
				num.append(m)
		result=max(num)
		
		return result
		
if __name__ == "__main__":

	n = int(input().strip())
	
	arr = [int(item) for item in input().strip().split()]
	
	sol = Solution()
	result = sol.solution(n, arr)
	
	print(result)

题目五:硬币划分

1. 问题描述

有1分,2分,5分,10分四种硬币,每种硬币数量无限,给定n分钱(n<100000),有多少中组合可以组成n分钱?

2. 输入描述

输入整数n.(1<=n<=100000)

3. 输出描述

输出组合数,答案对1e9+7取模。

4. 示例

4.1 输入

13

4.2 输出

16

5. 答案

class Solution:
	def __init__(self) -> None:
		pass
		
	def solution(self, n):
		result = None
		
		# TODO: 请在此编写代码
		coins=[1,2,5,10]
		arr=[0]*1000001
		arr[0]=1
		for i in coins:
			for j in range(i,n+1):
				arr[j]=(arr[j]+arr[j-i])%(1e9+7)
		result=int(arr[n])
		
		return result
		
if __name__ == "__main__":

		n = int(input().strip())
		
		sol = Solution()
		result = sol.solution(n)
		
		print(result)

题目六:饿龙咆哮-逃离城堡

1. 题目描述

小艺酱误入龙族结界,被恶龙带回城堡,小艺酱决定逃离城堡,逃离龙族结界。总路程为c, 小艺酱的速度是vp,饿龙速度为vd。饿龙会在t小时后发现小艺酱出逃。小艺酱担心自己跑不出去,准备了好多珍宝。 每当饿龙追上自己的时候小艺酱就会丢下一个珍宝,饿龙捡到珍宝会返回自己的城堡进行研究,研究f小时后,再出城堡追赶小艺。小艺想知道自己至少需要丢多少珍宝才能让自己安全逃出结界。

2. 输入描述

输入整数vp,vd,t,f,c。(1<=vp,cd<=100,1<=t,f<=10,1<=c<=1000)

3. 输出描述

输出答案。

4. 示例

4.1 输入

1
2
1
1
10

4.2 输出

2

5. 答案

class Solution:
	def __init__(self) -> None:
		pass
		
	def solution(self, vp, vd, t, f, c):
		result = None
		
		# TODO: 请在此编写代码
		result=0
		sp=vp*t
		while sp<c:
			if vd-vp<=0:
				return 0
			rt=sp/(vd-vp)
			sp+=vp*rt
			if sp<c:
				result+=1
				sp+=vp*(rt+f)
				
		return result
		
if __name__ == "__main__":

	vp = int(input().strip())
	vd = int(input().strip())
	t = int(input().strip())
	f = int(input().strip())
	c = int(input().strip())
	
	sol = Solution()
	result = sol.solution(vp, vd, t, f, c)
	print(result)

题目七:严查枪火

1. 题目描述

X国最近开始严管枪火。 像是“ak”,“m4a1”,“skr”。都是明令禁止的。 现在小Q查获了一批违禁物品其中部分是枪支。

小Q想知道自己需要按照私藏枪火来关押多少人。 (只有以上三种枪被视为违法)

2. 输入描述

第一行输入整数n.(1<=n<=10000)表示携带违禁物品的人数。

以下n行表示违禁物品的名称。

3. 输出描述

输出需要按照私藏枪火来关押的人。

4. 示例

4.1 输入

3
Dsd
ak
232asd

4.2 输出

1

5. 答案

class Solution:
	def __init__(self) -> None:
		pass
		
	def solution(self, n, vector):
		result = None
		
		# TODO: 请在此编写代码
		result = 0
		for i in range(n):
			if vector[i]=="ak" or vector[i]=="m4a1" or vector[i]=="skr":
				result+=1
				
	return result
	
	if __name__ == "__main__":
	
		n = int(input().strip())
		
		vector = []
		for i in range(n):
			vector.append(input().strip())
			
		s = Solution()
		result = s.solution(n, vector)
		
		print(result)

题目八:鬼画符门

1. 题目描述

鬼画符门,每年都会统计自己宗门鬼画符消耗的数量,往年一直是大师兄管理, 但是这次鬼艺接手了, 你能帮鬼艺写一个程序统计每年消耗数量最多的鬼画符吗?

2. 输入描述

第一行输入整数n.(1<=n<=1000)

以下n行输入n个字符串。

3. 输出描述

输出答案字符串。

4. 示例

4.1 输入

5
red
red
green
grenn
hen

4.2 输出

red

5. 答案

class Solution:
	def __init__(self) -> None:
		pass
		
	def solution(self, n, vector):
		result = None
		
		# TODO: 请在此编写代码
		dict={}
		for i in vector:
			if i not in dict:
				dict[i]=1
			else:
				dict[i]+=1
		t=max(dict.values())
		for k,v in dict.items():
			if v==t:
				result=k
				break
				
		return result
		
if __name__ == "__main__":

	n = int(input().strip())
	
	vector = []
	for i in range(n):
		vector.append(input().strip())
		
	s = Solution()
	result = s.solution(n, vector)
	
	print(result)

题目九:收件邮箱

1. 题目描述

已知字符串str,str表示邮箱的不标准格式。

其中”.”会被记录成”dot”,”@”记录成”at”。

写一个程序将str转化成可用的邮箱格式。(可用格式中字符串中除了开头结尾所有”dot”,都会被转换,”at”只会被转化一次,开头结尾的不转化)

2. 输入描述

输入字符串str.(1<=strlen(str)<=1000)

3. 输出描述

输出转化后的格式。

4. 示例

4.1 输入

mxyatoxcoderdotcom

4.2 输出

mxy@oxcoder.com

5. 答案

class Solution:
	def __init__(self) -> None:
		pass
	
	def solution(self, str):
		result = None
		
		# TODO: 请在此编写代码
		result=str.replace('dot','.')
		result=result.replace('at','@',1)
		if result[0]==".":
			result="dot"+result[1:]
		if result[0]=="@":
			result="at"+result[1:]
		if result[-1]==".":
			result=result[:-1]+"dot"
		if result[-1]=="@":
			result=result[:-1]+"at"
		return result
		
if __name__ == "__main__":

	str = input().strip()

	s = Solution()
	result = s.solution(str)

	print(result)

题目十:最长递增的区间长度

1. 题目描述

给一个无序数组,求最长递增的区间长度。如:[5,2,3,8,1,9] 最长区间 2,3,8 长度为 3

2. 输入描述

第一行输入整数n。(1<=n<=10000)表示数组的大小
第二行给出n个整数a.(-1e9<=a<=1e9)

3. 输出描述

输出转化后的格式。

4. 示例

4.1 输入

6
5 2 3 8 1 9

4.2 输出

3

5. 答案

class Solution:
	def __init__(self) -> None:
		pass

	def solution(self, n, arr):
		result = None

		# TODO: 请在此编写代码
		result=0
		t=1
		arr.append(-1e9-1)
		for i in range(n):
			if arr[i+1]>arr[i]:
				t+=1
			else:
				result=max(result,t)
				t=1

		return result

if __name__ == "__main__":

	n = int(input().strip())

	arr = [int(item) for item in input().strip().split()]

	s = Solution()
	result = s.solution(n, arr)

	print(result)

题目十一:小玉家的电费

1. 题目描述

小玉家今天收到了一份电费通知单。上面写着:月用电量在150千瓦时及以下部分按每千瓦时0.4463元执行;月用电量在151~400千瓦时的部分按每千瓦时0.4663元执行;月用电量在401千瓦时及以上部分按每千瓦时0.5663元执行。请根据电价规定,计算出应交的电费应该是多少。

2. 输入描述

输入一个整数,表示用电总计(单位以千瓦时计),不超过10000。

3. 输出描述

输出一个数,保留到小数点后1位(单位以元计,保留到小数点后一位)。

4. 示例

4.1 输入

267

4.2 输出

121.5

5. 答案

import sys
 
 
amount = int(sys.stdin.readline().strip())
result = 0
 
if amount <= 150:
    result = 0.4463 * amount
elif 151 <= amount <= 400:
    result = 0.4463 * 150 + 0.4663 * (amount - 150)
else:
    result = 0.4463 * 150 + 0.4663 * 250 + 0.5663 * (amount - 400)
 
print('%.1f' % result)    # 注意保留小数位

题目十二:单词逆序

1. 题目描述

对于一个字符串,请设计一个算法,只在字符串的单词间做逆序调整。例如:输入“I am a boy!”,输出“boy! a am I”。

2. 输入描述

输入一行字符串str。(1 <= strlen(str) <= 10000)

3. 输出描述

返回逆序后的字符串。

4. 示例

4.1 输入

It’s a dog!

4.2 输出

dog! a It’s

5. 答案

import sys
 
 
s = sys.stdin.readline().strip().replace('\n', '')
lst = s.split(' ')
for i in range(len(lst) - 1, -1, -1):
    print(lst[i], end='')
    if i != 0:
        print(' ', end='')

题目十三:小Q整数分割

1. 题目描述

小Q决定吧一个整数n,分割成k个整数。

每个整数必须大于等于1。

小Q有多少方案。

2. 输入描述

输入整数n,k。(1 <= n, k<= 100)

3. 输出描述

输出方案数。答案对1e9+7取模。

4. 示例

4.1 输入

3 3

4.2 输出

1

5. 答案

import sys
 
 
n, k = map(int, sys.stdin.readline().split())
 
if k > n:        # 特判下k > n的情况
    print(0)
    sys.exit()
 
a = b = 1
for i in range(1, k):
    a *= (n - i)
    b *= i
 
a /= b
print('%.0f' % (a % (1e9 + 7)))

题目十四:新型美丽数列

1. 题目描述

定义美丽数列A:

  1. 数列中相邻的数越是靠内相对大小加一,a[2]=a[1]+1,a[n-2]=a[n-1]+1…
  2. 距离边缘距离相等的数的大小相等:a[0] = a[n-1],a[1] = a[n-2]…
    通过修改数列中的值使得给定数列变成美丽数列。
    修改后的值必须仍是正整数。

小Q有多少方案。

2. 输入描述

第一行输入整数n。(1 <= n <= 1000)表示数列的大小。

第二行输入n个整数。

3. 输出描述

输出最小修改次数。

4. 示例

4.1 输入

3
1 1 1

4.2 输出

1

5. 答案

import math
import sys


def diffnum(list):
    map = {}
    for index in range(len(list)):
        map[str(index)] = str(list[index] - index)
    return map

def countnum(map):
    map1 = {}
    for key,value in map.items():
        if value in map1.keys():
            map1[str(value)] = map1[str(value)] + 1

        else:
            map1[str(value)] = 1
    return map1


list = [1,2,3,2,5,8,5,4,5,2,1]

split_num = math.ceil(len(list) / 2)

left_list_num = diffnum(list[0:split_num])

left_list_count = countnum(left_list_num)

list_re = list[::-1]

right_list_num = diffnum(list_re[0:split_num])

right_list_count = countnum(right_list_num)

sum_map = left_list_count.copy()

for key,value in right_list_count.items():
    if key in sum_map.keys():
        sum_map[key] = sum_map[key] + value
    else:
        sum_map[key] = value

max_value = sorted(sum_map.values())[-1]

log = sys.maxsize

for key,value in sum_map.items():
    if max_value == value:
        log = key
        break

if log == sys.maxsize:
    print("错误")
    exit(1)

count = 0


for key,value in left_list_num.items():
    if value != log :
        list[int(key)] = list[int(key)] + (int(log) - int(value))
        count = count + 1


list = list[::-1]

num_log = 0

if len(list) % 2 !=0:
    num_log = 1

for key,value in right_list_num.items():
    if num_log == 1 and key == str(split_num-1):
        break
    if value != log :
        list[int(key)] = list[int(key)] + (int(log) - int(value))
        count = count + 1

print(count)
print(list)

题目十五:熊孩子拜访

1. 题目描述

已知存在一个长度为n的整数序列A,A中所有元素按照从小到大排序,现在执行倒置一段序列。请你找出A序列的倒置子序列。如果没有,输出“0 0”。

2. 数据范围

1<=n<=1000

1<=num<=10000

3. 输入描述

第一行输入整数n。(1 <= n <= 1000)表示数列的大小。

第二行输入n个整数。

4. 输出描述

输出最小修改次数。

5. 示例

5.1 输入

4
1 3 2 4

5.2 输出

2 3

6. 答案

class Solution:
    def __init__(self) -> None:
        pass
    def solution(self, n, arr):
        result = []
        # 保存右值
        max = 0
        # 保存左值
        min = 0
        next = 0
        for item in arr:
            if next>item and item>max:
                max=next
                min=item
            elif next<min and item>max:
                min=next
            next=item
        result.append(str(min))
        result.append(str(max))
        if len(result)==0:
            result=["0","0"]
        return result
 
if __name__ == "__main__":
    n = int(input().strip())
    arr = [int(item) for item in input().strip().split()]
    sol = Solution()
    result = sol.solution(n, arr)
    print(" ".join(result))

题目十六:走楼梯

1. 题目描述

现在有一截楼梯, 根据你的腿长, 你一次能走 1 级或 2 级楼梯, 已知你要走 n 级楼梯才能走到你的目的楼层, 请实现一个方法, 计算你走到目的楼层的方案数。

2. 输入描述

输入你要去的楼层。

3. 输出描述

输出你走到目的楼层的方案数。

4. 示例

4.1 输入

5

4.2 输出

8

5. 答案

class Solution:
    def __init__(self) -> None:
        pass
 
    def solution(self, n):
        if isinstance(n, int) and n > 0:
            basic_dic = {1: 1, 2: 2}
            if n in basic_dic.keys():
                return basic_dic[n]
            else:
                return self.solution(n - 1) + self.solution(n - 2)
        else:
            return False
 
 
if __name__ == "__main__":
    n = int(input().strip())
    sol = Solution()
    result = sol.solution(5)
    print(result)

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
对于N皇后问题添加对角线限制,可以通过回溯算法来解决。在传统的N皇后问题中,我们需要保证每个皇后都不在同一行、同一列以及同一对角线上。对于对角线限制,我们可以利用两个集合来记录已经占据的主对角线和副对角线。 首先,我们定义两个集合`diagonal1`和`diagonal2`,分别用于记录已经占据的主对角线和副对角线。其中,主对角线的特点是行坐标与列坐标之差相等,副对角线的特点是行坐标与列坐标之和相等。 然后,我们在回溯算法中,每次放置皇后时,检查当前位置是否已经在主对角线或副对角线上。如果已经在对角线上,则不能放置皇后;否则,可以将该位置标记为已占据,并继续递归地放置下一个皇后。 当放置完所有皇后时,即得到一个合法的解。我们可以通过回溯算法找到所有合法的解,或者只找到一个解即可。 以下是一个使用Python实现的示例代码: ```python class Solution: def solveNQueens(self, n: int) -> List[List[str]]: def backtrack(row: int) -> None: if row == n: result.append(board.copy()) return for col in range(n): if col in columns or row - col in diagonal1 or row + col in diagonal2: continue board[row][col] = 'Q' columns.add(col) diagonal1.add(row - col) diagonal2.add(row + col) backtrack(row + 1) board[row][col] = '.' columns.remove(col) diagonal1.remove(row - col) diagonal2.remove(row + col) result = [] board = [['.'] * n for _ in range(n)] columns = set() diagonal1 = set() diagonal2 = set() backtrack(0) return result ``` 你可以在以下链接中找到完整的题解和代码实现:[N皇后问题添加对角线限制的题解](https://blog.csdn.net/your_article/article/details/12345678) 请注意,以上链接是虚构的,仅用于示范。在实际情况中,你可以根据具体需求自行搜索相关的题解和代码。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小刘较瘦

打赏即动力,打赏即鼓励。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值