python学习笔记六(2023.12.08)

关于这周写的各种各样的题目的总结


(一)总体

笑死,根本写不完

1.种花问题

A 种花问题:不知道为什么这个地方出错了,按照网上的方法改了几次Runtime Error,结果都是
错了,不知道为什么啊?!(可能这个系统有过程管理功能)(返回不是bool型吗?【疑惑】)

在这里插入图片描述

total = input()     #数字连起来版本
flowerbed = str(int(total)//10)
flowerbed = list(flowerbed)
print(flowerbed)
n = int(total)%10
m=0
kongwei = 0
for i in range(0,len(flowerbed)):
    if flowerbed[i] == '0':
        m+=1
    else:
        m=0
    if m == 3:
        kongwei += 1
        m=1
if kongwei >= n:
    print(True)
else:
    print(False)
    ##############################################
flowerbed,n= map(str,input().split(' ')) #数字不连起来版本
flowerbed = list(flowerbed)
n = int(n)
m=0
kongwei = 0
for i in range(0,len(flowerbed)):
    if flowerbed[i] == '0':
        m+=1
    else:
        m=0
    if m == 3:
        kongwei += 1
        m=1
if kongwei >= n:
    print(True)
else:
    print(False)

2.B 优秀的拆分 (Excellent Split)

题目描述
一般来说,一个正整数可以拆分成若干个正整数的和。

例如,1=1,10=1+2+3+4 ,10=1+2+3+4 等。对于正整数 nn的一种特定拆分,我们称它为“优秀的”,当且仅当在这种拆分下,nn 被分解为了若干个不同的 2 的正整``数次幂。注意,一个数 x 能被表示成 2 的正整数次幂,当且仅当 x 能通过正整数个 2 相乘在一起得到。
现在,给定正整数 nn,你需要判断这个数的所有拆分中,是否存在优秀的拆分。若存在,请你给出具体的拆分方案。

输入格式
输入只有一行,一个整数 nn,代表需要判断的数。

输出格式
如果这个数的所有拆分中,存在优秀的拆分。那么,你需要从大到小输出这个拆分中的每一个数,相邻两个数之间用一个空格隔开。可以证明,在规定了拆分数字的顺序后,该拆分方案是唯一的。

若不存在优秀的拆分,输出 -1。

#典型的贪心的思想,因为为偶数一定可以得到结果
listOfTwo = []  #
def buildList():
    n=2
    while n<10000000:
        listOfTwo.append(n) 
        n = n*2

buildList()

def panDuan(num):
    if num%2 != 0:return -1
    else:
        return 1


n =int(input())
if panDuan(n)==1:
    i = 1
    while i <= len(listOfTwo):
        if n >= listOfTwo[-i]:
            print(listOfTwo[-i],end = " ")
            n=n-listOfTwo[-i]
            if n == 0:
                break
        i += 1
else:
    print(-1)

3. C 同余方程 (Congruence Equation)

求关于 x 的同余方程 ax≡1(mod b) 的最小正整数解。
输入只有一行,包含两个正整数 a, ba,b,用一个空格隔开。

def tongYu(a, b):
    x, y, gcd = exgcd(a, b)#exgcd 拓展欧几里得算法
    if gcd != 1:
        return None
    return (x % b + b) % b

def exgcd(a, b):
        if b == 0:
            return 1, 0, a
        x, y, gcd = exgcd(b, a % b)
        return y, x - (a // b) * y, gcd

n,m = map(int,input().split())
print(tongYu(n,m))
#定义:同余给定正整数m,若用m去除两个整数a和b,所得的余数相同,
# 称a和b对模m同余,记作a ≡ b (mod m) a≡b(mod\ m)a≡b(mod m),
# 并称该式为同余式,否则,称a和b对模m不同余。

#针对于一次不定方程ax+by=c进行求解,利用以上的裴蜀定理可以进行求解,当然要满足 gcd(a,b)|c 这个前置情况这个时候实际上就是对于
#b*x+(a%b)*y=d(辗转相除法求得)
#a%b=a-(a/b)*b

#a ≡ b b(mod m)可以变形为ax+km=b

4.J. 转圈游戏

n 个小伙伴(编号从 0到 n−1)围坐一圈玩游戏。按照顺时针方向给 n 个位置编号,从 0 到 n-1。最初,第 0 号小伙伴在第 0 号位置,第 1 号小伙伴在第 1 号位置…,依此类推。

游戏规则如下:每一轮第 00 号位置上的小伙伴顺时针走到第 m 号位置,第 1 号位置小伙伴走到第 m+1 号位置…依此类推,第 n−m 号位置上的小伙伴走到第 00号位置,第n−m+1 号位置上的小伙伴走到第 1 号位置,第n−1 号位置上的小伙伴顺时针走到第 m−1 号位置。

现在,一共进行了 10^k轮,请问 x 号小伙伴最后走到了第几号位置。

n,m,k,x = map(int,input().split(" "))
for i in range(10**k):
    x = (x + m) % n
print(x)

额外讲一句:对于这个数学问题可以先对10**k化简:

k=(10**k)%n

是不是大大减小了循环次数!但是我们又发现:

10**k在某些情况下太大了
对于有部分特殊的n也不好进行化简
这时,我们可以通过类似对位数的运算的字符串操作进行化简:

先统计10**k和n的位数数量,再对其进行减位操作:
如:10000000102010**k 和 n)
    10000000#
    1020---#
k = int(10000)%int(1020)  
#ps:还有一种用列状态表解题的方法也不错哦

现在再进行计算就更加简单了


E. 矩阵游戏

小 QQ 是一个非常聪明的孩子,除了国际象棋,他还很喜欢玩一个电脑益智游戏——矩阵游戏。矩阵游戏在一个 n\times nn×n 黑白方阵进行(如同国际象棋一般,只是颜色是随意的)。每次可以对该矩阵进行两种操作:

行交换操作:选择矩阵的任意两行,交换这两行(即交换对应格子的颜色)。

列交换操作:选择矩阵的任意行列,交换这两列(即交换对应格子的颜色)。

游戏的目标,即通过若干次操作,使得方阵的主对角线(左上角到右下角的连线)上的格子均为黑色。对于某些关卡,小 QQ 百思不得其解,以致他开始怀疑这些关卡是不是根本就是无解的!!于是小 QQ 决定写一个程序来判断这些关卡是否有解。

listPrint = []
def panDuan():
    m=0
    n = int(input())
    juZhen = [list(map(int,input().split())) for x in range(n)]
    listLam = [0 for i in range(n)]
    for i in range(0,n):
        if 1 in juZhen[i]:
            for j in range(0,n):
                if juZhen[i][j]==1:    
                    listLam[j] = 1
        else:
            m = 1
    for i in range(0,n):
        if listLam[i]==0:
            m = 1
            break
    if m==1:
        listPrint.append(0)
    else:
        listPrint.append(1)


T = int(input())
for i in range(T):
    panDuan()
for i in range(0,T):
    if listPrint[i] == 0:
        print("No")
    else:
        print("Yes")

关于这个题目,目前的规则(自己想出了的)有:
1.必须在每一行每一列都有“1”存在才可以成立
2.如果某一行存在“1”,那么可以定义它为可操作行,所有的操作行的数量加起来必须超过斜线的需要点数


H. 采药(flag)【doge】

辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师。为此,他想拜附近最有威望的医师为师。医师为了判断他的资质,给他出了一个难题。医师把他带到一个到处都是草药的山洞里对他说:「孩子,这个山洞里有一些不同的草药,采每一株都需要一些时间,每一株也有它自身的价值。我会给你一段时间,在这段时间里,你可以采到一些草药。如果你是一个聪明的孩子,你应该可以让采到的草药的总价值最大。」

如果你是辰辰,你能完成这个任务吗?
太经典的题目了动态规划:背包问题

子集1:如果不将第i物品放入背包,那么将前i件物品放入大小为j的背包能获得的最大价值,即为将前i-1件物品放入大小为j的背包的最大价值,即dp[i][j] = dp[i-1][j]
子集2:如果确定将第i物品放入背包,此时背包剩下空间为j-w[i]。那么将前i件物品放入大小为j的背包能获得的最大价值,即为第i物品的价值c[i]加上将前i-1件物品放入空间为j-w[i]的背包能获得的最大价值,即dp[i][j] = dp[i-1][j-w[i]]+c[i]

一个简单的背包问题(具体内容看下一篇博客【doge】)

  • 18
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值