A、use
首先要分析复杂度题目中 n n n 是 1 0 5 10^5 105 , O ( n 2 ) O(n^2) O(n2)是会 T L E TLE TLE的!
题目求
a
[
i
]
+
a
[
j
]
>
b
[
i
]
+
b
[
j
]
a[i]+a[j]>b[i]+b[j]
a[i]+a[j]>b[i]+b[j]
(
i
<
j
)
(i<j)
(i<j)的对数
这种给定式子的题目,一般来说先要将相同下标放在一起,方便寻找思路。
本题可以转换成
a
[
i
]
−
b
[
i
]
+
a
[
j
]
−
b
[
j
]
>
0
a[i]-b[i]+a[j]-b[j] > 0
a[i]−b[i]+a[j]−b[j]>0
然后令
c
[
i
]
=
a
[
i
]
−
b
[
i
]
c[i]=a[i]-b[i]
c[i]=a[i]−b[i],原式转换为
c
[
i
]
+
c
[
j
]
>
0
c[i]+c[j] > 0
c[i]+c[j]>0
对
c
c
c数组进行从小到大排序,然后遍历
c
c
c数组。
对于每个
c
[
i
]
c[i]
c[i]找到最小的下标
x
x
x,满足
c
[
i
]
+
c
[
x
]
>
0
c[i]+c[x] > 0
c[i]+c[x]>0,不难推出当且仅当下标
j
j
j处于
[
x
,
n
]
[x,n]
[x,n]才满足
c
[
i
]
+
c
[
j
]
>
0
c[i]+c[j] > 0
c[i]+c[j]>0
找最小的下标
x
x
x,用二分即可。
注意本题是 ( i < j ) (i<j) (i<j),最后答案需要减掉 ( i ≥ j ) (i \geq j) (i≥j)的部分。
B、小精灵爱打工
二分最少需要花多少时间。
c
h
e
c
k
(
x
)
check(x)
check(x)部分实现,x为二分的时间
对
a
a
a数组从大到小排序表示建造顺序,随后遍历
a
a
a数组。(这里用到贪心,花费时间长的要先建造完)
定义变量
t
o
l
tol
tol表示当前精灵数目
对于每个
a
[
i
]
a[i]
a[i],维护一个
b
[
i
]
b[i]
b[i]表示建造
i
i
i建筑的精灵出现时间。
在
b
[
i
]
+
t
≤
x
b[i]+t \leq x
b[i]+t≤x的前提下,不断分裂新精灵,即更新
b
[
t
o
l
+
1
]
b[tol + 1]
b[tol+1]的时间。(这里也用到贪心,新精灵出现时间要尽可能早)
最后判断 t o l ≥ n tol \geq n tol≥n即可
C、迷宫问题
很简单的BFS,建议百度BFS。
D、算数
与A题基本一致,只需要修改一下二分的下标范围即可。
E、树上问题
学过树的话,这题很简单。
可以去学一下树和它的遍历方法。
然后用树的遍历方法,维护出每个节点的深度即可。
F、走出迷宫
很简单的
d
p
dp
dp题目,维护一个
d
p
dp
dp二维数组
d
p
[
i
]
[
j
]
dp[i][j]
dp[i][j]表示从
(
1
,
1
)
(1,1)
(1,1)走到
(
i
,
j
)
(i,j)
(i,j)的方案数,因为
(
i
,
j
)
(i,j)
(i,j)可以由
(
i
−
1
,
j
)
(i-1,j)
(i−1,j)和
(
i
,
j
−
1
)
(i,j-1)
(i,j−1)走一步到达,因此如下:
初始化
d
p
[
1
]
[
1
]
=
1
dp[1][1] = 1
dp[1][1]=1
d
p
dp
dp转移方程:
d
p
[
i
]
[
j
]
=
(
d
p
[
i
−
1
]
[
j
]
+
d
p
[
i
]
[
j
−
1
]
)
dp[i][j] = (dp[i - 1][j] + dp[i][j - 1])
dp[i][j]=(dp[i−1][j]+dp[i][j−1]) mod
2333
2333
2333
这里多了一个取模操作,不知道取模操作可以百度一下。
G、安排课程
我们不妨先将课程按截止时间从小到大排序,然后不断更新答案课程表即可。
按这种排序,可以忽略答案课程表内课程截止时间的影响。
因此加一个课程只需要满足加入课程后答案课程表的最少时间花费小于等于加入课程的截止时间。
因此只需要维护答案课程表的最少时间花费。
对于满足加入条件的课程,我们只需要直接加入课程即可。
若不满足,说明该课程不能直接加入课程表,因此我们需要判断此课程能否通过替换之前选中的课程来更新答案课程表的最少时间花费即可。
对答案课程表选中的每个课程加入优先队列,来维护最多时间花费的课程,当替换后最少时间花费少于当前课程截止时间,就进行替换操作。
(注意替换操作一个课程只能替换一个课程,如果一个课程替换多个课程答案就会变小)