Python每日一练:圆桌&争风吃醋的豚鼠&韩信点兵(全一行代码解法)


前言

很显然,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))能正确输出。


总结

状态不好,随便水了几题。我感觉第三题是题目有问题。如果有同鞋知道是什么原因,请留言指出为谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

无证的攻城狮

如本文对您有用,大爷给打个赏!

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

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

打赏作者

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

抵扣说明:

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

余额充值