A题
题意
有一个由 $ 0,1 $ 组成的数组 $ a $ ,请删除不超过 $ n/2 $ 个数使奇数位上的数之和等于偶数位上的数之和。
思路
看到 $ n/2 $ 就想到应该是与把某一个数全部删除有关。
1.如果 $ 0 $ 不少于一半,那么把 $ 1 $ 全部删去。
2.如果 $ 0 $ 少于一半,那么把所有 $ 0 $ 删去,如果 $ 1 $ 的个数为奇数则再删去一个 $ 1 $ 。
B题
题意
对一个数组 $ a $ 重新排序,使得数组 $ c $ 的字典序尽量大。 $ c_i=gcd(a_1,a_2...a_i) $ 。
思路
首先第一个数肯定是最大数,然后每一次找一个能使最大公约数尽量大的数,时间复杂度为 $ O(n^2logn) $ ,可以过。
C题
题意
有一个前 $ n $ 个正整数的排列,每次询问 $ x,y $ 得到 $ a_x mod a_y $ 的值,最多使用 $ 2n $ 次询问,猜出这个序列。
思路
对于两个数 $ a<b $ , $ a mod b=a, b mod a < a $ ,故通过询问 $ a,b $ 和 $ b,a $ 就可以确定一个数,即每两次询问可以确定两者中较小的数。经过 $ 2(n-1) $ 次后仍有一个数不能确定,因为是前 $ n $ 个正整数的排列,所以他就是最大数 $ n $ 。
D题
题意
有 $ n $ 栋高楼排成一行,每栋楼都有一个高度 $ h_i $ 。如果 $ i,j $ 满足以下三个条件之一,则称可以从第 $ i $ 栋楼跳到第 $ j $ 栋楼。
1.$ j=i+1 $ 。
2.$ max(h_{i+1},h_{i+2}...h_{j-1})<min(h_i,h_j) $ 。
3.$ min(h_{i+1},h_{i+2}...h_{j-1})>max(h_i,h_j) $ 。
现在你在楼 $ 1 $ ,请求出跳到楼 $ n $ 最少要跳几次。
思路
显然是一个 $ DP $ ,有 $ 3 $ 个条件可以转移方程。第 $ 1 $ 个条件很显然。
第 $ 2 $ 个条件
E题
题意
$ n $ 个点 $ m $ 条边的有向图,边有黑白两种颜色。现在要给点染色,每个点染成黑或白,白点只能走它连出的白色边,黑点只能走它连出的黑色边,求一种染色方案使得 $ 1→n $ 的最短路径最长。
思路
如果正着走过去,每次要讨论点是黑色还是白色,那太难了。如果反向考虑,从 $ n $ 走回 $ 1 $ ,那就是根据走过边的颜色确定到达点的颜色,限制少一些,看起来可行。
考虑用 $ bfs $ 先把 $ n $ 加入队列,每次第一次可以走到某一点时就把路封上,即给这个点染上与边相反的颜色,如果以后有与该点颜色相同的边可以走过来时,再将该点加入队列。因为所有边的长度均为 $ 1 $ ,所以先加入队列的点一定比后加入队列的点 $ dis $ 值小,所以这样做是正确的。
注意:
1.有向图,在开始时只用添加反边即可。
2. $ n=1 $ 时可能需要特判。
总结
这一次只做出来了前三题,D是因为单调栈只会模板,但是内核没有搞得很清楚;E如果想到能反过来应该也就做出来了,可惜没想出来。下次努力。
提交记录
写的很乱,请多多包容!!!
$ A $ 题: A
$ B $ 题: B
$ C $ 题: C
$ D $ 题: D
$ E $ 题: E