AcWing第 89 场周赛

AcWing 4803. 满足的数

n = int(input())
a = list( map( int , input().split(' ') ) )
s = 0
for i in a :
    s += i
res = 0
for x in range( 1 , 5+1 ) :
    if ( s + x ) % (n+1) != 1 :
        res += 1
print(res)

AcWing 4804. 构造矩阵

首先初始化二维矩阵且值全为1,将b[x][y]==0对应的位置都全部赋值为0,检验b[x][y]==1是否合法

n , m = map( int , input().split(' ') )
b = [ list( map( int , input().split(' ' ) ) ) for i in range(n) ]

a = [ [1 for i in range(m)] for i in range(n) ]

for x in range(n):
    for y in range(m):
        if b[x][y] == 0 :
            for i in range(n):
                a[i][y] = 0
            for i in range(m):
                a[x][i] = 0
        

for x in range(n):
    for y in range(m):
        if b[x][y] == 1:
            cnt = 0
            for i in range(n):
                cnt += a[i][y]
            for i in range(m):
                cnt += a[x][i]
            if cnt == 0:
                print("NO")
                exit()
print("YES")
for x in range(n):
    for y in range(m):
        print( a[x][y] , end=" \n"[ 1 if y == m-1 else 0 ] )

AcWing 4805. 加减乘

dp题目。其实加一和乘二都好处理,难点在于减一。

如果i通过(i+1)-1得到,哪么一定有(i+1)通过(i+1)/2得到。因为如果\((i+1)\)通过i+1得到,那么f[i+1] = f[i] + x , f[i] = f[i+1] + x = f[i]+2*x一定会冲突。

那么(i+1)会不会通过(i+2)-1获得呢?

如果是这样的话,f[i] = f[i+1]+x= f[i+2]+2*x = f[(i+2)/2]+2*x+y ,但是会有f[i]=f[x/2]+y=f[x/2+1]+x+y 这样的更优解出现

这样的话就只在i为奇数的是否考虑从(i+1)/2转移过来。这样就去掉了后效性

n, x, y = map(int, input().split(' '))
f = [10 ** 18 for i in range(n + 1)]
f[0] = 0
for i in range( 1 , n + 1):
    if i % 2 == 0:
        f[i] = min(f[i // 2] + y, f[i - 1] + x)
    else:
        f[i] = min(f[i - 1] + x, f[(i + 1) // 2] + x + y)
print(f[n])
posted @ 2023-02-05 23:38  PHarr  阅读(21)  评论(0编辑  收藏  举报