China场 Codeforces Round #789 (Div. 2) 蒟蒻做题记录 Python题解,A - B2(铑勿喷)

不知道是不是这场是 China 场的缘故·,打的比较轻松 ,也是ac了前三道,但是第四道卡住了,TLE和MLE轮番蹂躏我(QAQ)

首先致敬猫猫头出题人: Tokitsukaze !!!

接下来复盘一下做题过程

A. Tokitsukaze and All Zero Sequence

CF一如往常的思维题,也就是脑经急转弯,想出来的朋友可以直接秒,但是想不出来就.......

(by the way, 为甚开小号,因为大号在#788直接卡A导致心态boom.......)

既然说了找规律,那就可以分这几种情况,从而可以用肉眼算法去做:

操   作   次   数

数据有 0

元素总数 - 0元素个数
数据有相同的数但是无 0元素总数 + 1(使任意相同数其中一个归0) - 1( 除去已经处理过的一个数 )
除去以上两种之外元素总数 + 1(使任意两个数相同)+ 1(使任意相同数其中一个归0) - 1( 除去已经处理过的一个数 )

显而易见,只有这三种情况,所以我们很容易得出公式:

                                   \large \left\{\begin{matrix}len(ans) - ans.count(0) & & \\ len(ans) & & \\ 2+ len(ans) - 1 & & \end{matrix}\right. 

然后出装收集者秒它就行

完整代码:

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))

B1. Tokitsukaze and Good 01-String (easy version)

 easy version)

这道B如果当算法做的话,还是会很绕(铑除外QAQ)

所以我们可以观察他的题意来进行巧算,刚好他给出了两个even,数据长度和操作充分条件

所以我们可以维护一个步长为 2 以及长度为 2滑动窗口来进行判断是否需要操作

如图:

1110011000

首先,我们窗口锁定[ 1  1 ] ,可以看到1 == 1 不需要改变(自信做自己ヾ(@^▽^@)ノ

然后我们移动滑窗 --->

111001100

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)

B2. Tokitsukaze and Good 01-String (hard version)

 芜湖!!!(harrrrrrrrrd version)

不知道为什么,此题歪果银通过率不如往常,可能是不同国家教育下的思维差异???

欢迎讨论(拜托,骗访客量的China boy 超酷的 --> 我自己

不废话了,看题嘿嘿,首先,他让我们来找最短的子串数

比如 110011 是 三,因为 11,00,11,

而110000可能是最优解,因为 11,0000 可以看见是两个

我们通过这个例子可以看出,最优解依赖于不可变项

比如:

000110

可以看出[ 0   0 ] 是不可变项,所以后面处理后结果应改为 [ 0  0  0  0 ],这显然是一种贪心,

我们可以根据不可变项来贪心(TNND!贪!为什么不贪),当然,这个例子仅仅是简单的一种情况,接下来我把情况都列出来(当时因为少了一种而WA一发,寄!)

  1. 1 1 1 1 1 0 0 1 1 1(图示情况)
  2. 1 1 0 0 0 1 0 0 1 1 
  3. 1 1 0 0 0 1 1 1 0 0

大致就是这三种状况,我们可以依然用滑窗来遍历确定不可变项位置关系,再用数学关系出来

代码如下:

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)

C. Tokitsukaze and Strange Inequality(浅谈)

嘶,这道题卡了四十分钟,一维前缀和TLE , 二维的MLE,难受,还是方法不到位,但是前缀和思想肯定没问题,欢迎大家讨论

此外,我发现一个有趣的题:

一模一样啊喂, Tokitsukaze来挨打!,而且这道题一维和二维不会wa,C题lower版吧

大家有兴趣可以做做:https://codeforces.com/contest/1400/problem/D

芜湖,我也该去补提啦,溜了溜了

大家加油喽,CFer冲冲冲!!!

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值