传送门
想不到这次居然还能把 E 整出来,怀疑 D E 题是不是反了
上大分
A. Minimums and Maximums
大概就是两个区间之间判断一下交点,其实数据量很小,直接 for 循环跑一边都行
#include
#include
#include
#include
#include
#include
#include
#include
B. Robots
因为最终是到左上角,所以可以判断一下所有机器人最多可以往左和往上走几步,然后再在终点的这个区间里搜索有没有机器人
感觉这个题可以改版一下,设置一个终点,然后就四个方向搜索
#include
#include
#include
#include
#include
#include
#include
#include
C. Binary String
二分 + 尺取 || 尺取
二分+尺取:时间复杂度为 \(O(nlogn)\)
答案是单调的,所以直接二分枚举答案,然后再 judge 判断的时候,尺取中间剩下的区间
#include
#include
#include
#include
#include
#include
#include
#include
尺取,时间复杂度为 \(O(n)\)
这里用到一个贪心,只有在剩余区间的代价和删除区间的代价尽可能相等的时候,是最优解
所以就可以根据这个,尺取每个区间 \([l, r]\),因为对于区间 \([l_{i+1}, r_{i+1}]\),必然有 \(r_i \leq r_{i+1}\)
#include
#include
#include
#include
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int t;
cin >> t;
while(t--)
{
string s;
cin >> s;
int cnt0 = 0, cnt1 = 0, len = s.length();
for(int i=0; i
E. Moving Chips
线性dp
本来想用连通块求最短的方法,但是我一看到一个奇葩样例,直接否决这个想法,就是样例的第三个,那个倒三角
采取 dp 的方式:
设 \(dp[i][j]\),表示前 i 列只剩下一个芯片,且该芯片位于 第 i 列 第 j 行,所花费的最小代价
dp 的状态转移(以第 0 行为例):
-
如果在第 i 列的第 1 行存在芯片,则:\(dp[i][0] = min(dp[i-1][0], dp[i-1][1]) + 2\),因为不论是从哪里来,都得消除掉第 1 行的芯片,再加上一次的到第 0 行的代价,所以都是 + 2
-
如果在第 i 列的第 1 行不存在芯片,则:\(dp[i][0] = min(dp[i-1][0] + 1, dp[i-1][1] + 2)\),在同一行,直接移动过来,所以代价是 1,在不同行,移动过来代价是 2
对于第 1 行的话,也是一样的策略,所以直接用异或 和 for 循环替代了
这个 dp 的起点是从第一个芯片所在列开始,所以要先搜索到第一个芯片的位置,然后给这一列的 dp 初始化
如果两行都有芯片,则两边初始代价都是 1,如果只有一行有,则那一行的代价为 0,另一行的代价为 1 (需要将芯片移动过来)
同时答案也得不断地更新,理论上答案应该是出现芯片的最后一列的位置
这题和蓝桥杯省赛 B 组那个放积木那题挺像
#include
#include
#include
#include
#include
#include
#include
#include