【延边旧事】【对未来的恐惧】【相信自己】

前言

旧事涌上心头,在大学的日子,会暴露你的很多缺点,有时你下意识的决定,在别人看来是很不符合规矩的,我知道在大学试错成本很低,但有些问题,出现了就马上去解决,不要以为这次没付出代价,就可以永远万事大吉,人是一种很特殊的动物,有的时候最深的伤害,不是肉体的,而是心灵的,那是最容易无心造成,又最不容易让它恢复如初的,做好以后的自己,不要再让在乎你的人受伤了。

1、作物杂交


难度: 中等 标签: 搜索, 2020, 省赛
这题要用一手二叉树思想,形成明显的层次关系,每一层找最大的时间相加

N,M,K,T=map(int,input().split())
growtime=list(map(int,input().split()))
growtime.insert(0,0)//对齐编号
existseed=list(map(int,input().split()))
relation=[list(map(int,input().split())) for i in range(K)]
parent=[[] for i in range(N+1)]
for elem in relation:
    a=[elem[0],elem[1],max(growtime[elem[0]],growtime[elem[1]])]//存放种子的双亲,以及培育时间
    parent[elem[2]].append(a)
dp=[float('inf') for i in range(N+1)]//存放当前种子最短时间的数组
for i in existseed:
    dp[i]=0

def dns(t):
    if dp[t]!=float('inf')://不是无穷大说明已经赋值过了
        return dp[t]
    for item in parent[t]:
        dp[t]=min(dp[t],max(dns(item[0]),dns(item[1]))+item[2])//培育双亲时间最大值+双亲培育t号的时间
        return dp[t]
print(dfs(T))

2、异或数列

在这里插入图片描述
难度: 简单 标签: 省赛, 2021

def get_bit(num)://一位一位记录,转二进制
    n=0
    while num>=1:
        bit=num&1
        bits[n]+=bit
        num>>=1
        n+=1
N=int(input())
for i in range(N):
    temp=[int(i) for i in input().split()]
    n=temp[0]//每行个数
    nums=temp[1:]
    bits=[0 for i in range(20)]//最大是20位
    flag=0//判断异或是否为0
    for num in nums:
        get_bit(num)
        flag^=num
    if flag==0://如果序列的异或结果为0,那么意味着这两个值与这些序列异或之后是相等的
        print(0)
        continue
    else://所有X集合内的数的二进制表示的第i位([20,1])上1的个数是偶数时,跳过此时判断
        for i in range(20)://第i位数字中所有0的个数
            if bits[19-i]==1://最高位只有一个1,谁抢到了谁win
                print(1)
                break
            if bits[19-i]%2==1 and (n-bits[19-i])%2==0:
                print(1)//所有X集合内的数的二进制表示的第i位([20,1])上1的个数是奇数时
                break//所有X集合内的数的二进制表示的第i位0的个数是偶数,先手胜
            if bits[19-i]%2==1 and (n-bits[19-i])%2==1:
                print(-1)
                break

3、砝码称重

在这里插入图片描述

N=int(input())
arr1=list(map(int,input().split()))
arr1.sort()
arr2=[]
set1=set(arr2)
for i in arr1:
    if arr2==[]://空 就进去
        arr2.append(i)
        set1.add(i)//这两个一样的不能去掉
    else:
        for j in arr2://借助两个数组,把所有能产生的数都加进去,+-
            set1.add(i)//这两个一样的不能去掉
            set1.add(i+j)
            set1.add(abs(i-j))
        arr2=list(set1)//所有组合加进去
if 0 in set1://最后把0除去
    set1.remove(0)
print(len(set1))

关于为什么不能把相同语句去掉,我做了一个实验,第一个是正常,第二个去掉了else中的,第三个去掉了if中的。大家仔细思考一下,有问题可以comment。
在这里插入图片描述

4、分考场

在这里插入图片描述

def dfs(x,room)://给x同学安排考察,room现在的处于的考场
    global num,p,n
    if room>=num://超过容量不行
        return
    if x>n://调整一下
        num=min(room,num)
        return
    flag=False
    for j in range(1,room+1):
        k=0
        while p[j][k] and a[x][p[j][k]]==0://判断关系和位置是否有人
            k+=1
        if p[j][k]==0://没人就坐
            p[j][k]=x
            dfs(x+1,room)//安排下一个同学
            p[j][k]=0//最后还原
            flag=True
            break
    p[room+1][0]=x
    dfs(x+1,room+1)//这个考场不能坐了
    p[room+1][0]=0
n=int(input())
m=int(input())
num=110
a=[[0 for j in range(n+1)] for i in range(n+1)]
p=[[0 for j in range(n+1)] for i in range(n+1)]
for i in range(m):
    u,v=map(int,input().split())
    a[u][v]=1
    a[v][u]=1
dfs(1,0)
print(num)

写到这里的时候给我父母打了个视频,21岁的我,对未来充满了未知的恐怖,我害怕倾尽所有仍遗憾收尾,害怕努力没结果,害怕让希望我变好的人失望,青春的恐惧源于你对未知的茫然,网络让我们相遇,网络让世界联通,但网络不是现实,成年人要对自己负责。
引用一句朋友发给我的话“We want you to surprise us and disappoint us and impress us and amaze us.”我们希望你给我们惊喜、让我们失望、给我们留下印象、让我们惊叹。
无论这条路的结果如何,也无论最后的尽头是得偿如愿还是大失所望,this is life,come boy。追逐的路上不要忘记路边的风景。

5、平面分割

在这里插入图片描述

# 初始平面数为1
# 平面中每添加一条直线,平面数+1
# 新添加的直线与已有的直线的交点个数为N, 平面数再+N

def isintersect(k1, b1, k2, b2):
    # 判断两条直线是否相交
    if k1 != k2://斜率不同起码不会平行或重合
        return True
    else:
        return False

def getpoint(k1, b1, k2, b2):
    # 计算两条直线的交点
    x = (b2 - b1) / (k1 - k2)//列个等式就好
    // y=kx+b k1x+b1==k2x+b2 (y-b1)/k1=x=(y-b2)/k2
    y = (k2 * b1 - k1 * b2) / (k2 - k1)
    return (x, y)

def isin(x0, y0, k, b):
    # 判断某点是否在某条直线上
    if y0 == k * x0 + b:
        return True
    else:
        return False

N = int(input())
li = [list(map(int, input().split())) for i in range(N)]
exist = [] # 记录平面中已有的直线
# exist.append(li[0])
res = 1 # 记录平面的个数,初始为1
for item in li://遍历直线斜率和
    points= [] # 记录新添加的直线与已有直线的交点
    if item in exist: # 如果已有这条直线则直接跳过
        continue
    for e in exist: # 遍历已有的直线
        if isintersect(item[0], item[1], e[0], e[1]):
            # 如果新添加的直线与已有的直线相交
            # 计算它们的交点并记录
            new = getpoint(item[0], item[1], e[0], e[1])
            if new not in points:
                points.append(new) 
    res += (len(points) + 1)
    exist.append(item)
print(res)

6、括号序列

在这里插入图片描述

难度: 中等 标签: 省赛, 2021


没写出来哥哥们

结语

好吧,承认自己的普通,今天尽力了,早点休息兄弟们

猜你喜欢

转载自blog.csdn.net/weixin_53415043/article/details/129778163