2019暑期集训 - Day 4
哎,这个学校的 OJ 是个什么鬼啊
概述
提高 B 组
3题:T0 , T1 , T2
190/300 分
13/165 名
T0 数列变换
TLE 60/100 分
Description1
小X 看到堆成山的数列作业十分头疼,希望聪明的你来帮帮他。考虑数列 \(A=[A_1,A_2,\cdots ,A_n]\) ,定义变换 \(f(A,k)=[A_2,A_3 ,\cdots,A_k,A_1,A_{k+2},A_{k+3},\cdots,A_{2k},A_{k+1}, \cdots]\) ,也就是把 \(a\) 分段,每段 \(k\) 个(最后如果不足 \(k\) 个,全部分到新的一段里,见样例),然后将每段的第一个移动到该段的最后一个。
现在,小X 想知道 \(f (f \cdots (f (f ([1,2,3,⋯,n],2),3),\cdots ),n)\) 的结果。
Input
输入一行包含一个整数 \(n\) 。
Output
输出一行包含 \(n\) 个整数,表示最终的数列。
Sample Input
4
Sample Output
4 2 3 1
Hint
$f ([1,2,3,4],2) = [2,1,4,3] $
$f ([2,1,4,3],3) = [1,4,2,3] $( 3 单独被分在一组,移动到组的最后一位,仍然是 3 )
$f ([1,4,2,3],4) = [4,2,3,1] $
Hint
对于 60% 的数据,\(1≤ n ≤10^3\)。
对于 100% 的数据,\(1≤ n ≤10^6\) 。
Solution
妙啊!!!
这题模拟很容易想到,就按他说的做,每次移动
但是模拟会 TLE ,\(O(N^2)\) 的时间复杂度太吓人了,所以需要优化
因为每次分组每组的长度是相同的,所以可以把每组的第一个换到下一组的第一个
比如
\([1,2,3,4,5,6,7,8]\)
当每组长度为 \(3\) 时,就把 \(1\) 放在 \(4\) 的位置上,\(4\) 放在 \(7\) 的位置上, \(7\) 则放在最后去.这样就把数组变成了
\([\ \Box ,2,3,1,5,6,4,8,7]\)
其中 \(1\) 原来所在的位置就空出来
如此重复每次分组,就可以用 \(2n\) 大小的数组记录,用 \(O(n\log n)\) 的时间完成了
T1 卡牌游戏
WA 47.6/100 分
Description
小X 为了展示自己高超的游戏技巧,在某一天兴致勃勃地找小Y 玩起了一种卡牌游戏。每张卡牌有类型(攻击或防御)和力量值两个信息。
小Y 有 \(n\) 张卡牌,小X 有 \(m\) 张卡牌。已知小X 的卡牌全是攻击型的。
游戏的每一轮都由小X 进行操作,首先从自己手上选择一张没有使用过的卡牌 \(x\)。如果小Y 手上没有卡牌,受到的伤害为 \(x\) 的力量值,否则小X 要从小Y 的手上选择一张卡牌 \(y\) 。若 \(y\) 是攻击型(当 \(x\) 的力量值不小于 \(y\) 的力量值时才可选择),此轮结束后 \(y\) 消失,小Y 受到的伤害为 \(x\) 的力量值与 \(y\) 的力量值的差;若 \(y\) 是防御型(当 \(x\) 的力量值大于 \(y\) 的力量值时才可选择),此轮结束后 \(y\) 消失,小Y 不受到伤害。
小X 可以随时结束自己的操作(卡牌不一定要用完)。希望聪明的你帮助他进行操作,使得小Y 受到的总伤害最大。
Input
输入的第一行包含两个整数 \(n\) 和 \(m\) 。
接下来 \(n\) 行每行包含一个字符串和一个整数,分别表示小Y 的一张卡牌的类型(“ATK”表示攻击型,“DEF”表示防御型)和力量值。
接下来 \(m\) 行每行包含一个整数,表示小X 的一张卡牌的力量值。
Output
输出一行包含一个整数,表示小Y 受到的最大总伤害。
Sample Input
输入1:
2 3
ATK 2000
DEF 1700
2500
2500
2500
输入2:
3 4
ATK 10
ATK 100
ATK 1000
1
11
101
1001
Sample Output
输出1:
3000
输出2:
992
Hint
【样例说明1】
第一轮,小X 选择自己的第一张卡牌和小Y 的第二张卡牌,小Y 的第二张卡牌消失。
第二轮,小X 选择自己的第二张卡牌和小Y 的第一张卡牌,小Y 的第一张卡牌消失,同时受到 500 点伤害。
第三轮,小X 选择自己的第三张卡牌,此时小Y 手上已经没有卡牌,受到 2500 点伤害。
小X 结束游戏,小Y 共受到 3000 点伤害。
【样例说明2】
第一轮,小X 选择自己的第三张卡牌和小Y 的第一张卡牌,小Y 的第一张卡牌消失,同时受到 91 点伤害。
第二轮,小X 选择自己的第四张卡牌和小Y 的第二张卡牌,小Y 的第二张卡牌消失,同时受到 901 点伤害。
小X 结束游戏,小Y 共受到 992 点伤害。
【数据范围】
各规模均有一半数据满足小Y 只有攻击型卡牌。
对于 30% 的数据,\(1≤ n,m ≤ 6\) 。
对于 60% 的数据,\(1≤ n,m ≤10^3\) 。
对于 100% 的数据,\(1≤ n,m ≤10^5\) ,力量值均为不超过 \(10^6\) 的非负整数。
Solution
贪心
如果小Y 没有防御卡,就把小X 的牌从大到小 sort ,小Y 的牌从小到大 sort
然后一一对应,只要小X 的牌比小Y 的牌大就拿小X 的牌攻击小Y 的牌
因为这样总能保证获取最大利益
如果小Y 的牌都被干完了,小X 剩下的牌就都要攻击
如果小Y 有防御卡,就分两种情况,第一种只攻击攻击卡,第二种先攻击完了防御卡,再打攻击卡;最后取 max 就好了
事实上,上面的方法是错的,只能得部分分,正确思路正在摸索中
Update :
已解决
分两种情况,一是打完所有的牌,二是只干攻击牌(如果不打完所有牌,小X 攻击小Y 的防御牌是无意义的,所以只存在以上两种情况)。
第一种情况
我们先让小X 用尽量小的牌干掉小Y 的所有防御牌,然后剩下的牌只需要保证能干掉所有的攻击卡即可。
具体操作,将小X 的牌,小Y 的攻击、防御牌全部按从小到大 sort
然后对于每个防御牌,用 lower_bound 找到小X 最小的能干掉这张防御牌的牌,用它摧毁那张防御牌(即将小X 这张牌的力量值清零)。
然后用小X 剩下的牌摧毁小Y 所有的防御牌(算法和上面的差不多,只不过小X 牌的力量值只需要减去小Y 攻击牌的力量值)。
如果上面两个操作都能完成,那么小X 剩下的所有牌都可以直接打小Y 了,只需要把小X 剩下的所有牌的力量值求和,即为情况一的答案。
第二种情况
很好办了,跟上文所述相同。
T2 舞台表演
TLE 80/100 分
Description
小X 终于找到了自己的舞台,希望进行一次尽兴的表演。
不妨认为舞台是一个 \(n\) 行 \(m\) 列的矩阵,矩阵中的某些方格上堆放了一些装饰物,其他的则是空地。小X 可以在空地上滑动,但不能撞上装饰物或滑出舞台,否则表演就失败了。
小Y 为了让小X 表演得尽量顺畅,提前为小X 写好了每一段时间的移动方向。每个时刻,听话的小X 都会依据小Y 写好的所在时间段的方向(东、西、南、北)向相邻的方格滑动一格。由于小Y 之前没有探查过舞台的情况,如果
小X 直接按照小Y 写好的来移动,很容易表演失败。
不过,小Y 是个天使,拥有让小X 停在原地的魔法,也就是某一时刻,小X 以为自己移动了实际上没有移动。为了让小X 表演得尽量完美,小Y 想使小X 在舞台上滑行的路程尽量长(当然不能中途表演失败)。可惜小Y 的智商不足
以完成这么复杂的计算,希望你来帮助她决定哪些时刻该使用魔法。当然,她关心的首先是最长的路程是多少。
Input
输入的第一行包含五个整数 \(n,m,x,y,k\) 。\((x, y )\) 为小 X的初始位置,\(k\) 为时间的段数。
接下来 \(n\) 行每行包含 \(m\) 个字符,描述这个舞台(“.” 表示该位置是空地,“x” 表示该位置有装饰物)。
接下来k 行每行包含三个整数 \(s_i,t_i,d_i \ (1\leq i\leq k )\) ,表示在时间段\([s_i,t_i ]\) 内,小 X的移动方向是 \(d_i\) 。\(d_i\) 为 \(1,2,3,4\) 中的一个,依次表示北、南、西、东(分别对应矩阵中的上、下、左、右)
Output
输出一行包含一个整数,表示小X 滑行的最长路程。
Sample Input
4 5 4 1 3
..xx.
.....
...x.
.....
1 3 4
4 5 1
6 7 3
Sample Output
6
Hint
保证输入的时间段是连续的,即 \(s_1=1,s_i=t_{i-1}+1\ (1<i\leq k) , t_k=t\) 。
对于 30% 的数据,\(1≤ t ≤ 20\) 。
对于 60% 的数据,\(1≤t ≤ 200\) 。
对于 100% 的数据,\(1≤ n,m,k ≤ 200,1≤t ≤10^5\) 。

Solution
什么鬼东西,一个代码提交能有 3 种分数
又是动态规划
这次设 \(f_{(i,j,k)}\) 代表从坐标 \((i,j)\) 开始走第 \(k\) 步,可以滑行的最长路径
如果 \(s_k=1,t_k=3,d_k=4\) 那么 \(f_{(i,j,k)}=\max{(f_{(i,j,k+1)},f_{(i,j+1,k+1)},f_{(i,j+2,k+1)},f_{(i,j+3,k+1)})}\)
也就是枚举每一种滑行的长度
注意各种数据优化,要不是这个时间刚刚好的方法会 TLE
优化
scanf 比 cin 快
getchar 比 scanf 快
自己写的比 STL 快
打表比现算快
O2 开比不开快
WA 比 AC 快

浙公网安备 33010602011771号