求证明/证伪/hack
查看原帖
求证明/证伪/hack
942161
Tomle楼主2024/11/30 20:07

rt

思路:

ii11nn 扫一遍,维护 aabb 两个串中 ii 所在的连通块中剩余的 0011 的个数(s1,0/1s_{1,0/1} 表示 aa 串中剩余的 0/10/1s2,0/1s_{2,0/1} 表示 bb 串,同理),然后分四种情况:

  • ci=di=0c_i = d_i = 0,若 ai=bia_i = b_i,答案加一;
  • ci=0,di=1c_i = 0, d_i = 1,若 s2,ai1s_{2,a_i}\ge 1,答案加一,s2,ais_{2,a_i} 减一,否则,s2,1ais_{2,1-a_i} 减一;
  • ci=1,di=0c_i = 1, d_i = 0,与第二种情况类似;
  • ci=di=1c_i = d_i = 1
    • s1,01,s2,01s_{1,0}\ge 1,s_{2,0}\ge 1 答案加一,s1,0,s2,0s_{1,0},s_{2,0} 各减一;
    • 否则,若 s1,11,s2,11s_{1,1}\ge 1, s_{2,1}\ge 1,答案加一,s1,0,s2,0s_{1,0},s_{2,0} 各减一;
    • 若以上两条都不满足,说明目前只能出两个不能抵消的数字,若 s1,01s_{1,0}\ge 1,则 s1,0s_{1,0} 减一,否则 s1,1s_{1,1} 减一,s2s_2 同理。
  • 另外,cic_idid_i 等于 00 时,更新 ss

(“抵消”指能通过移动使得 ai=bia_i=b_i,下同)

个人拙见:

我个人认为这个做法很正确,每个数字只要能抵消就是最优的,与抵消的位置无关,所以让每个数字在前面抵消。

这个结论个人认为可以证明上述贪心做法。

对一些问题的思考

Q:若 ii 处可以抵消,但将 ii 处的两数拆开,能让后面原本不能抵消的位置抵消,如何选择最优?

A:显然,交换后答案不变。

Q:若某处既可以填两个 00,也可以填两个 11,如何选择最优?

A:选哪个对答案没有影响,可以转换成第一个问题思考。

2024/11/30 20:07
加载中...