刷题记录

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")

以上是关于刷题记录的主要内容,如果未能解决你的问题,请参考以下文章

1013.开门人和关门人

6C - 开门人和关门人

leetcode刷题(131)——背包问题理解

leetcode刷题(132)——完全背包问题思路理解

C++上机练习:关门人和开门人

算法刷题总结