A. AvtoBus
题目大意
巴士车队的所有巴士总共拥有 n 只轮胎,巴士车队有两种巴士,一种是4只轮胎的,一种是6只轮胎的。
问这个车队拥有的巴士数量的最小值和最大值。不满足输出-1
。
题目解析
首先判断是否满足,可以观察发现轮子数量需要满足以下两个条件:
首先来计算满足条件的最大值。 为了能让巴士车队的巴士数目最多,那么轮子数目为4的巴士越多越好。
Cntcars=4n
如果nmod4=0,就刚好能满足情况。
如果nmod4=2,那么 4 只轮子的巴士数目是 4n−1 ,6 只轮子的巴士数目是 1 ,巴士总数是 4n 。
然后来计算满足条件的最小值。 这里我们希望轮子数目为6的巴士数目越多越好。
Cntcars=6n
如果nmod6=0,那么刚好能全部都是6个轮子的巴士。
如果nmod6=2,那么 6 只轮子的巴士的数目是 6n−1 ,4 个轮子的巴士的数目是 2 ,巴士总数是 6n+1 。
如果nmod6=4,那么 6 只轮子的巴士的数目是 6n,4 只轮子的巴士数目是 1 ,巴士总数是 6n+1 。
参考代码
B. Stone Age Problem
题目大意
对于一个数组,有两种操作方式:
- 将第 i 个位置的元素,修改为 x。
- 将数组中所有元素修改为 x。
对于每一次操作,计算数组中元素之和。
题目解析
对于数组中的每个位置,记录上次修改的时间和值。同时记录上次全局修改的时间和值。
对于操作1,比较 i 位置修改的时间和全局修改的时间,然后选择最新的去获取元素差,从而更新数组中元素之和。
对于操作2,直接修改全局上次修改时间和值,并更新数组中元素之和。
参考代码
C. Rooks Defenders
题目大意
你有一个棋盘,棋盘大小是 n×n。
然后有三种操作:
- 向棋盘中 (x,y) 坐标位置放置一枚
车
。
- 将棋盘中 (x,y) 坐标位置的
车
移除,保证这个坐标位置有一枚车
。
- 给你一个子矩形,矩形用左上角坐标 (x1,y1) 和右下角坐标 (x2,y2) 表示。问棋盘上面的
车
的移动范围能不能攻击到这个矩形内的所有位置。
题目解析
分别用数组记录每一行和每一列一共有多少枚车
。
当每一行(列)出现第一个车
,或者最后一枚车
消失的时候,将当前行(列)的车
数目更新到树状数组或者线段树。
然后统计子矩阵所覆盖的行是不是全部能被车
覆盖到 或者 每一列都能被 车
覆盖到。
参考代码
D. Toss a Coin to Your Graph…
题目大意
有一个不包含自环的有向图,图上的每一个节点都拥有一个权值 ai,问你从某个节点出发,经过 k−1 条单向边,经过的所有节点的最大值最小。
题目解析
二分一下最大值 amax,然后判断在不经过权值超过最大值的节点情况下,能不能满足经过 k−1 条单向遍。
对于每次一次二分枚举 amax ,将权值超过 amax 的点和与它相连的边移除,判断剩余的图形是否存在节点数大于或者等于k的链,或者存在环。这个可以用拓扑排序解决一下。
参考代码