不知道是不是这场是 China 场的缘故·,打的比较轻松 ,也是ac了前三道,但是第四道卡住了,TLE和MLE轮番蹂躏我(QAQ)
首先致敬猫猫头出题人: Tokitsukaze !!!
接下来复盘一下做题过程
CF一如往常的思维题,也就是脑经急转弯,想出来的朋友可以直接秒,但是想不出来就.......
(by the way, 为甚开小号,因为大号在#788直接卡A导致心态boom.......)
既然说了找规律,那就可以分这几种情况,从而可以用肉眼算法去做:
操 作 次 数 | |
数据有 0 |
元素总数 - 0元素个数 |
数据有相同的数但是无 0 | 元素总数 + 1(使任意相同数其中一个归0) - 1( 除去已经处理过的一个数 ) |
除去以上两种之外 | 元素总数 + 1(使任意两个数相同)+ 1(使任意相同数其中一个归0) - 1( 除去已经处理过的一个数 ) |
显而易见,只有这三种情况,所以我们很容易得出公式:
然后出装收集者秒它就行
完整代码:
t = int(input())
for i in range(t):
n = int(input())
ans = list(map(int,input().split(" ")))
if 0 in ans:
print(len(ans) - ans.count(0))
else:
box = list(set(ans))
if len(box) == len(ans):
print(2+ len(ans) - 1)
else:
print(len(ans))
(easy version)
这道B如果当算法做的话,还是会很绕(铑除外QAQ)
所以我们可以观察他的题意来进行巧算,刚好他给出了两个even,数据长度和操作充分条件
所以我们可以维护一个步长为 2 以及长度为 2 的滑动窗口来进行判断是否需要操作
如图:
1 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 0 |
首先,我们窗口锁定[ 1 1 ] ,可以看到1 == 1 不需要改变(自信做自己ヾ(@^▽^@)ノ)
然后我们移动滑窗 --->
1 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 0 |
可以看到,此时锁定的是[ 1 0 ] ,1 != 0,所以我们可以改变1 or 0,此时 res+=1,以此类推
完整代码:
t = int(input())
for T in range(t):
n = int(input())
str = list(input())
res =0
for i in range(0,len(str)-1,2):
if str[i] != str[i+1]:
res+=1
print(res)
芜湖!!!(harrrrrrrrrd version)
不知道为什么,此题歪果银通过率不如往常,可能是不同国家教育下的思维差异???
欢迎讨论(拜托,骗访客量的China boy 超酷的 --> 我自己)
不废话了,看题嘿嘿,首先,他让我们来找最短的子串数
比如 110011 是 三,因为 11,00,11,
而110000可能是最优解,因为 11,0000 可以看见是两个
我们通过这个例子可以看出,最优解依赖于不可变项
比如:
0 | 0 | 0 | 1 | 1 | 0 |
可以看出[ 0 0 ] 是不可变项,所以后面处理后结果应改为 [ 0 0 0 0 ],这显然是一种贪心,
我们可以根据不可变项来贪心(TNND!贪!为什么不贪),当然,这个例子仅仅是简单的一种情况,接下来我把情况都列出来(当时因为少了一种而WA一发,寄!)
大致就是这三种状况,我们可以依然用滑窗来遍历确定不可变项位置关系,再用数学关系出来
代码如下:
t = int(input())
for T in range(t):
n = int(input())
str = list(input())
res =0
res1 = 0
res2 = 0
temp = len(str)
for i in range(0,temp-1,2):
if str[i] != str[i+1]:
res+=1
elif str[i] == str[i+1] == "1":
res1+=1
elif str[i] == str[i+1] == "0":
res2+=1
tempres = 0
if res1 == res2 == 0 and res!=0:
print(res,1)
elif res == 0:
for i in range(temp - 1):
if str[i] != str[i + 1]:
tempres += 1
print(res,tempres+1)
elif res1 !=0 or res2 != 0 and res != 0:
box = []
for i in range(0,temp-1,2):
if str[i] == str[i+1]:
if str[i] == "1":
box.append(1)
else:
box.append(0)
lth = len(box)
for i in range(lth-1):
if box[i] == box[i+1]:
box[i] = -1
result = 0
for j in box:
if j != -1:
result+=1
print(res,result)
嘶,这道题卡了四十分钟,一维前缀和TLE , 二维的MLE,难受,还是方法不到位,但是前缀和思想肯定没问题,欢迎大家讨论
此外,我发现一个有趣的题:
一模一样啊喂, Tokitsukaze来挨打!,而且这道题一维和二维不会wa,C题lower版吧
大家有兴趣可以做做:https://codeforces.com/contest/1400/problem/D
芜湖,我也该去补提啦,溜了溜了
大家加油喽,CFer冲冲冲!!!