Skip to content

P6002 [USACO20JAN] Berry Picking S

所以有前 k / 2号元素都是一个相同值

枚举这个值m,有三种情况

  • 最多能取出k个m,则前所有元素均为 m
  • 最多能取小于 k / 2 个 m,无解
  • 否则尽可能取多个 m,剩下部分取最大的即可.
_, k = map(int, input().split())
a = list(map(int, input().split()))
ans = 0
for m in range(1, 1001):
    num = 0
    res = 0
    rest = []
    for x in a:
        num += x // m
        rest.append(x % m)
    if num >= k:
        res = m * k // 2
    elif num >= k // 2:
        res = (num - k // 2) * m + sum(sorted(rest, reverse=True)[:(k - num)])
    ans = max(ans, res)
print(ans)

Cow Frisbee S

维护一个单调栈,每进入一个数 ai​,就向前扫描直到遇见一个 s_top​>ai​,由于有 ai​ 挡着,所以之后的我们全部都看不见,此时最终答案加上 (i−stop+1)。

from collections import deque

MAXN = int(1e6)

n = 0
ans = 0
a = [0] * (MAXN + 1)
s = deque()

n = int(input())
for i in range(1, n + 1):
    a[i] = int(input())

for i in range(1, n + 1):
    while s and a[s[-1]] < a[i]:
        ans += i - s[-1] + 1
        s.pop()
    if s:
        ans += i - s[-1] + 1
    s.append(i)

print(ans)

# [USACO19JAN] Icy Perimeter S

冰淇淋的面积用dfs很好求

只要算出每个联通块中'#'的个数即可

难点在于求联通快的周长

观察一下样例 发现周长就是每个'#'周围'.'或超过边界的方块个数

解决这一问题后这道题几乎就是一道dfs裸题了