前言
很显然,Python的受众远远大于C++,其实笔者本人对Python的理解也是远强于C++的,C++纯粹是为了假装笔者是个职业选手才随便玩玩的,借着十多年前学的C的功底,强行假装的。
因职业原因,Python更适用于运维、网络、AI方向,所以用得很多。最近假装职业码农装过头了,写点Python代码都习惯性加 ; 了,更离谱的是CSDN对笔者的能力判断中,C++一个劲地涨,Python都连能力都没了…
所以以后也要用Python来解解题,经常锻炼一下。
提示:昨天搞硬币划分没整一行代码,今天几题简单,正好又可以整活。
一、圆桌
题目描述:
有N个客人与足够多张的圆桌。主人安排每位客人坐在一个圆桌边,但是每位客人希望自己左右边上分别有一些空座位,不然会觉得害羞。注意,如果一个客人所在的圆桌只有他一个人,那么他左边的空座位数量就是他右边的空座位数量。 试问主人需要准备多少个座位,才能让每个客人舒适的坐下。
输入描述:
第一行输入一个整数N,(1<=N<=10000),代表客人的数量 接下来N行,每行两个整数li与ri,(1<=i<=N,1<=li<=ri<=1000000000) 代表第i位客人希望左边有li个空座位,右边有ri个空座位。
输出描述:
输出一个整数,代表主人需要准备的最少座位数量。
实话说吧~ 我小学语文是体育老师教的,阅读理解就没及格过,没看懂这题。没办法,只好去参考别人的思路,才搞明白是要做啥!
代码如下(示例):
class Solution:
def __init__(self) -> None:
pass
def solution(self, n, vector):
# 不正经的一行写法
result =sum([max(x,y) for x,y in zip(sorted([vector[i][0] for i in range(n)]),sorted([vector[i][1] for i in range(n)]))])+n
# TODO: 请在此编写代码
return result
if __name__ == "__main__":
n = int(input().strip())
vector = []
for i in range(n):
vector.append([int(item) for item in input().strip().split()])
sol = Solution()
result = sol.solution(n, vector)
print(result)
我写的就这一行:
result =sum([max(x,y) for x,y in zip(sorted([vector[i][0] for i in range(n)]),sorted([vector[i][1] for i in range(n)]))])+n
其它都是为了水字数!
按惯例要给个正经代码的写法的,不过我把这一行给拆出来后,竟然只有40分…不知道是不是不正经的代码写多了,正经的已经不会写了,所以省略正经代码了。
二、争风吃醋的豚鼠
题目描述:
N个节点两两建边。 不存在3个节点相互之前全部相连。(3个节点连接成环) 最多能建立多少条边?
输入描述:
输入整数n.(1<=n<=1e5)
输出最大边数
代码如下(示例):
class Solution:
def __init__(self) -> None:
pass
def solution(self, n):
result = int(n/2*(n-n/2))
# TODO: 请在此编写代码
return result
if __name__ == "__main__":
n = int(input().strip())
sol = Solution()
result = sol.solution(n)
print(result)
这回我不说它一行是不正经的了!不过这公式是哪来的呢?也就不要图了吧…
三、韩信点兵
题目描述:
韩信是中国古代伟大的军事家和统帅,他有一种独特的点兵方法:每个军队由若干个士兵组成,并且每个士兵有一个编号。 当韩信需要点兵时,他会给定一个正整数
K
K
K,表示点兵的人数。然后他会按照如下方式点兵: 1. 首先将所有士兵排成一列,编号依次为
1
,
2
,
3
,
.
.
.
,
n
1,2,3,...,n
1,2,3,...,n。 2. 从第
1
1
1 个士兵开始,每隔
K
K
K 个士兵,就取出一个士兵。 例如,当
n
=
10
n=10
n=10,
k
=
3
k=3
k=3 时,韩信会按照以下方式点兵: 1 4 7 10 你的任务是,给定
n
n
n 和
k
k
k,求出韩信点兵的顺序。
输入描述:
第一行包含两个整数
n
n
n 和
k
k
k,其中
n
n
n 表示士兵的数量,
k
k
k 表示点兵的人数。
输出描述:
输出一行,包含
n
n
n 个整数,表示韩信点兵的顺序。
示例:
输入
10 3
输出
1 4 7 10
代码如下(示例):
class Solution:
def __init__(self) -> None:
pass
def solution(self, n, k):
result = [str(i) for i in range(1,n+1,k)]
# TODO: 请在此编写代码
#print(n,k)
#print(t)
return result
if __name__ == "__main__":
arr_temp = [int(item) for item in input().strip().split()]
n = int(arr_temp[0])
k = int(arr_temp[1])
sol = Solution()
result = sol.solution(n, k)
print(" ".join(result))
嗯,不知道是不是我的阅读理解有问题…以上写法只通过了示例,实际是0分…我又用C++试了一样的逻辑,结果也一样只能通过示例。
我还偷看了测试的一组数据是 490 30
我输出的是:[‘1’, ‘31’, ‘61’, ‘91’, ‘121’, ‘151’, ‘181’, ‘211’, ‘241’, ‘271’, ‘301’, ‘331’, ‘361’, ‘391’, ‘421’, ‘451’, ‘481’],转换成字符串是为了原代码print(" ".join(result))能正确输出。
总结
状态不好,随便水了几题。我感觉第三题是题目有问题。如果有同鞋知道是什么原因,请留言指出为谢!