刷题记录
Posted 码丽莲梦露
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了刷题记录相关的知识,希望对你有一定的参考价值。
1 平分物体(动态规划,递归,迭代)
现在有n个物品,每一个物品都有一个价值,现在想将这些物品分给两个人,要求这两个人每一个人分到的物品的价值总和相同(个数可以不同,总价值相同即可),剩下的物品就需要扔掉,现在想知道最少需要扔多少价值的物品才能满足要求分给两个人。
T = int(input()) #取出循环组数
for x in range(T):
n = int(input()) #取出一组内数字个数
a = list(map(int,input().split())) #遍历数组保存至list
ans = 10000000000
def DFS(x, n, A, B, C):
global ans
if C > ans:return #递归终止条件
if x>=n:
if A == B:
ans = min(ans,C) #取C的最小值
return
DFS(x+1,n,A+a[x],B,C)
DFS(x+1,n,A,B+a[x],C)
DFS(x+1,n,A,B,C+a[x])
DFS(0, n, 0, 0, 0)
print(ans)
2 排队(动态规划)
现在有n个人排队买票,已知是早上8点开始卖票,这n个人买票有两种方式:
第一种是每一个人都可以单独去买自己的票,第 i 个人花费 a[i] 秒。
第二种是每一个人都可以选择和自己后面的人一起买票,第 i 个人和第 i+1 个人一共花费 b[i] 秒。
最后一个人只能和前面的人一起买票或单独买票。
由于卖票的地方想早些关门,所以他想知道他最早几点可以关门,请输出一个时间格式形如:08:00:40 am/pm
时间的数字要保持 2 位,若是上午结束,是 am ,下午结束是 pm
n = int(input())
for i in range(n):
num = int(input())
if num == 0:#没人的话,排队直接结束
print('08:00:00 am')
elif num == 1:#只有一个人的时候没有b[i]
a = int(input())
else:
list1 = list(map(int,input().split()))
list2 = list(map(int,input().split()))
dp = [0 for _ in range(num+1)]
dp[1] = list1[0]
for i2 in range(2,num+1):
dp[i2] = min(dp[i2-1]+list1[i2-1],dp[i2-2]+list2[i2-2])
a = dp[num]#最终需要排队的总用时
x = a//3600#处理成时间表示
y = a%3600//60
z = a%3600%60
if (x+8)>12:
print(str(x-4).rjust(2,'0')+':'+str(y).rjust(2,'0')+':'+str(z).rjust(2,'0'),'pm')
else:
print(str(x+8).rjust(2,'0') + ':' + str(y).rjust(2, '0') + ':' + str(z).rjust(2, '0'), 'am')
#rjust(2,'0')是将8变成08,对象是str
3 拆素数
牛牛现在有一个包含 n 个正整数的数组 a ,牛牛可以将其中的每个数 a[i] 都拆成若干个和为 a[i] 的正整数,牛牛想知道拆后(也可以一个数都不拆)这个数组最多能有多少个素数。
偶数可以分成n/2个2。
奇数可以分成n/2-1个2和1个3,分成n/2个2和1个1结果也是一样的。
n = int(input())
arr = list(map(int, input().split()))
ans = 0
for num in arr:
ans += num // 2
print(ans)
4 互相认可(tarjan 算法)
在一次聚会中,教授们被要求写下自己认可哪位教授的学术成果(也可以写自己,且可能出现重复)。已知,如果教授 A 认可教授 B ,且教授 B 认可教授 C,那么即可视为教授 A 也认可教授 C。现在我们想知道有多少对教授是两两互相认可的?
import collections
import sys
sys.setrecursionlimit(10000000)
res = [0]
def dfs(u, time, stack, dfn, low, matrix, instack):
dfn[u], low[u] = time[0], time[0]
stack.append(u)
instack[u] = 1
time[0] = time[0]+1
for v in matrix[u]:
if dfn[v]==0:
dfs(v, time, stack, dfn, low, matrix, instack)
low[u] = min(low[u], low[v])
elif instack[v]:
low[u] = min(low[u], low[v])
if dfn[u]==low[u]:
count = 0
while True:
temp = stack.pop()
instack[temp] = 0
count += 1
if temp==u:
break
res[0] += count*(count-1)/2
def tarjan(matrix, n):
dfn = [0]*n
low = [0]*n
instack = [0]*n
time = [1]
stack = []
for i in range(n):
if dfn[i]==0:
dfs(i, time, stack, dfn, low, matrix, instack)
n, m = map(int, input().split(' '))
matrix = collections.defaultdict(list)
for i in range(m):
u, v = map(int, input().split(' '))
matrix[u-1].append(v-1)
tarjan(matrix, n)
print(int(res[0]))
5 给定一个数独板的输入,确认当前的填法是否合法。
合法的输入需要满足以下三个条件:
1. 每一行的9个格子中是1-9的9个数字,且没有重复
2. 每一列的9个格子中是1-9的9个数字,且没有重复
3. 9个3*3的小格子中是1-9的9个格子,且没有重复
es=[]
def cheak(bord,col,row,num):
for i in range(9):
if bord[col][i]==num:
return False
for j in range(9):
if bord[j][row]==num:
return False
col_temp=col//3
row_temp=row//3
for i in range(col_temp*3,(col_temp+1)*3):
for j in range((row_temp)*3,(row_temp+1)*3):
if bord[i][j]==num:
return False
return True
def search(res):
for i in range(9):
for j in range(9):
if res[i][j]=="X":
continue
else:
temp=res[i][j]
res[i][j]="O"
if cheak(res,i,j,temp):
res[i][j]=temp
else:
return False
return True
while True:
try:
res.append(list(input()))
except:
break
if search(res):
print("true")
else:
print("false")
以上是关于刷题记录的主要内容,如果未能解决你的问题,请参考以下文章