天天看點

[acwing周賽複盤] 第 60 場周賽20230204補

[acwing周賽複盤] 第 60 場周賽20230204補

    • 一、本周周賽總結
    • 二、4803. 滿足的數
      • 1. 題目描述
      • 2. 思路分析
      • 3. 代碼實作
    • 三、4804. 構造矩陣
      • 1. 題目描述
      • 2. 思路分析
      • 3. 代碼實作
    • 四、4805. 加減乘
      • 1. 題目描述
      • 2. 思路分析
      • 3. 代碼實作
    • 六、參考連結

一、本周周賽總結

  • 晚上去吃牛蛙了,回來補題。
  • T1 模拟。
  • T2 矩陣模拟。
  • T3 DP。

二、4803. 滿足的數

連結: 4803. 滿足的數

1. 題目描述

[acwing周賽複盤] 第 60 場周賽20230204補

2. 思路分析

  • 枚舉即可。

3. 代碼實作

# Problem: 滿足的數
# Contest: AcWing
# URL: https://www.acwing.com/problem/content/4806/
# Memory Limit: 256 MB
# Time Limit: 1000 ms

import sys
import bisect
import random
import io, os
from bisect import *
from collections import *
from contextlib import redirect_stdout
from itertools import *
from array import *
from functools import lru_cache
from types import GeneratorType
from heapq import *
from math import sqrt, gcd, inf

if sys.version >= '3.8':  # ACW沒有comb
    from math import comb

RI = lambda: map(int, sys.stdin.buffer.readline().split())
RS = lambda: map(bytes.decode, sys.stdin.buffer.readline().strip().split())
RILST = lambda: list(RI())
DEBUG = lambda *x: sys.stderr.write(f'{str(x)}\n')

MOD = 10 ** 9 + 7


#       ms
def solve():
    n, = RI()
    a = RILST()
    s = sum(a)
    ans = 0
    for x in range(1, 6):
        if (s + x) % (n + 1) != 1:
            ans += 1
    print(ans)


if __name__ == '__main__':
    solve()

           

三、4804. 構造矩陣

連結: 4804. 構造矩陣

1. 題目描述

[acwing周賽複盤] 第 60 場周賽20230204補

2. 思路分析

  • 這種題一般是分别讨論行列。
  • 記錄一下都哪些行和列必須為0,構造出來這樣的矩陣,其餘位置都記1就是答案。
  • 構造過程:初始化一個全1矩陣,然後枚舉記錄的行列,置1。複雜度n*m。
  • 注意記錄完後,需要在周遊一次矩陣的1,檢視這個數對應的行列是否都是0。另外如果行=m/列=n,則全得是0,不能有1。

3. 代碼實作

# Problem: 構造矩陣
# Contest: AcWing
# URL: https://www.acwing.com/problem/content/4807/
# Memory Limit: 256 MB
# Time Limit: 1000 ms

import sys
import bisect
import random
import io, os
from bisect import *
from collections import *
from contextlib import redirect_stdout
from itertools import *
from array import *
from functools import lru_cache
from types import GeneratorType
from heapq import *
from math import sqrt, gcd, inf

if sys.version >= '3.8':  # ACW沒有comb
    from math import comb

RI = lambda: map(int, sys.stdin.buffer.readline().split())
RS = lambda: map(bytes.decode, sys.stdin.buffer.readline().strip().split())
RILST = lambda: list(RI())
DEBUG = lambda *x: sys.stderr.write(f'{str(x)}\n')

MOD = 10 ** 9 + 7


#       ms
def solve():
    m, n = RI()
    b = []
    row, col = set(), set()
    for i in range(m):
        b.append(RILST())
        for j, v in enumerate(b[-1]):
            if v == 0:
                row.add(i)
                col.add(j)
    for i, r in enumerate(b):
        for j, v in enumerate(r):
            if v:
                if i in row and j in col:
                    return print('NO')
                if len(row) == m or len(col) == n:
                    return print('NO')
    a = [[1]*n for _ in range(m)]
    for i in row:
        a[i] = [0]*n
    for j in col:
        for i in range(m):
            a[i][j] = 0
    print('YES')
    for r in a:
        print(*r)


if __name__ == '__main__':
    solve()

           

四、4805. 加減乘

連結: 4805. 加減乘

1. 題目描述

[acwing周賽複盤] 第 60 場周賽20230204補

2. 思路分析

DP.

  • f[i]要麼從i-1轉移,代價x。
  • 如果是偶數,可以從一半轉移,即從f[i] = f[i//2] + y。
  • 如果是奇數,可以從後一個數i+1轉移,i+1從(i+1)//2轉移,即f[i] = f[(i+1)//2)+x+y。
  • 為什麼偶數不從後一個轉移呢?
  • 如果從後邊來,實際是從i+2來,即f[i] = f[(i+2)//2]+2x+y = f[i//2+1]+2x+y。
  • 那我不如直接從一半來,即f[i] = f[i//2]+y。

3. 代碼實作

# Problem: 加減乘
# Contest: AcWing
# URL: https://www.acwing.com/problem/content/4808/
# Memory Limit: 256 MB
# Time Limit: 1000 ms

import sys
import bisect
import random
import io, os
from bisect import *
from collections import *
from contextlib import redirect_stdout
from itertools import *
from array import *
from functools import lru_cache
from types import GeneratorType
from heapq import *
from math import sqrt, gcd, inf

if sys.version >= '3.8':  # ACW沒有comb
    from math import comb

RI = lambda: map(int, sys.stdin.buffer.readline().split())
RS = lambda: map(bytes.decode, sys.stdin.buffer.readline().strip().split())
RILST = lambda: list(RI())
DEBUG = lambda *x: sys.stderr.write(f'{str(x)}\n')

MOD = 10 ** 9 + 7


#       ms
def solve():
    n, x, y = RI()
    h = [(0, 0)]
    f = [0] * (n + 1)
    for i in range(1, n + 1):
        f[i] = f[i - 1] + x
        if i & 1 == 0:
            f[i] = min(f[i], f[i // 2] + y)
        else:
            f[i] = min(f[i], f[(i + 1) // 2] + x + y)
    print(f[-1])


if __name__ == '__main__':
    solve()
           

六、參考連結