GYM 101194 | 2016-2017 ACM-ICPC CHINA-Final

F

明天学一下后缀自动机。
https://blog.csdn.net/qq_35649707/article/details/66473069

G

二合一,Kruskal重构树 + 线段树合并求子树众数。
昨天状态不好没时间写了。

D

除了硬核的分析与转化外,最优化问题可以用到的套路:

  • 二分
  • 流程
  • 图论
  • 随机
  • 搜索

C

题意:给定一个序列,找至多两个段,没有相同的数,最大化总长度。
我的做法:枚举第二个点,第一个点往里缩,维护第二段的最大值。
反思:ljm很有可能会丢假结论,这时候我的作用就要体现出来,把假结论叉掉,而不是被他骗去写。

L

以后还是用标准检查流程去查一遍,确保正确性。
过编译,过样例,看一遍代码,检查各种常见错误:

  • 数组大小
  • 初始化
  • 参数设置
  • 访问非法
  • LL(IO,运算)
  • 取模(及时取模,负数)
  • corner case
  • 时间:big case
  • 空间:算

E

需要练习一下 python,包括 IO 和一些基本操作。
LeetCode 1458
建立二维数组:

f = [[0 for j in range(m)] for i in range(n)]

不能写为

f = n * [m * [0]]

m * [0] 是对 0 进行深拷贝,没问题,但是 n * [m * [0]] 是对 m * [0] 进行浅拷贝,一个改则所有改。

LeetCode 685

  1. 以下代码:
def run(self, x, visited, graph):
    visited[x] = 1
    for y in graph[x]:
        if not visited[y]:
            self.run(y, visited, graph)

类中函数的第一个参数是 self,调用类中函数时需要用 self.函数名
2. 以下代码:

def get(self, x, pr):
    if pr[x] == x:
        return x
    pr[x] = self.get(pr[x], pr)
    return pr[x]

(1) Python 中的 return 语句中,不能有 =,写作 return pr[x] = self.get(pr[x], x) 甚至于写 return pr[x] = 1 都会报错。
(2) Python 中没有三目运算符,但是可以用以下方法来写:

def get(x, f):
    ret = x if x == f[x] else f[x] = get(x, f[x])
    return ret

a if 条件 else b:如果满足条件,值为 a,否则为 b。
3. j 从 n-1 枚举到 0。
(1) 下面写法:

j = n
while j >= 0:
    ...
    j -= 1

可能会出问题,因为如果中间有 continue,那么就不能成功使 j -= 1。如果要实现,那么每个 continue 前要写 j -= 1
(2) Python 中没有自增、自减运算符,只能写 j += 1, j -= 1
(3) 解决办法二:可以考虑在循环开始的时候减一。

j = n + 1
while j >= 1:
    j -= 1
    ...

(4) 解决办法三:可以考虑用 range 来实现。

for j in range(n - 1, -1, -1):
    ...

LeetCode 131

  1. 切片
a = [1, 2, 3, 4, 5]
b = a[::-1]
c = a[::-1]
b[0] = 10
print(a)
print(b)
print(c)

(1) 切片格式与基本参数
s[a:b:c]
切片的第一个参数:起点
切片的第二个参数:终点
切片的第三个参数:步长
(2) 切片拷贝了选中的每一位的信息。
对于基本类型,实现的是深拷贝;
对于列表、元组等对象,实现的是浅拷贝。
(3) 反转:a[::-1]


需要学习这几个点:

  1. 类相关
  2. Input
  3. Output

别人这道题的代码:

class Rational:
    def __init__(self, p, q):
        self.p = p
        self.q = q
    def __add__(self, other):
        return Rational(self.p * other.q + self.q * other.p, self.q * other.q)
    def __lt__(self, other):
        return self.p * other.q < self.q * other.p
if __name__ == '__main__':
    t = int(input())
    for z in range(1, t + 1):
        n = int(input())
        q = [Rational(0, 1)] * n
        for i in range(n):
            a, b = map(float, input().split(':'))
            a = int(a * 1000)
            b = int(b * 1000)
            q[i] = Rational(a, a + b)
        q.sort()
        cur = Rational(0, 1)
        cnt = 0
        for i in range(n):
            if cur + q[i] < Rational(1, 1):
                cur += q[i]
                cnt += 1
            else:
                break
        print(f'Case #{z}: {cnt}')

找几份代码,粘到模板上,这是目前性价比最高的办法。

原文地址:https://www.cnblogs.com/Sdchr/p/14647451.html