2 条题解

  • 0
    @ 2025-9-17 18:55:04

    众所周知,01串问题就是模拟,这次用的是二进制

    才开始没有什么想法,于是尝试 n = 2 的情况。

    我直接考虑最极端的情况,11 -> 01 -> 10 -> 00,没写出来可能比较难想,写出来发现,这不就是二进制的减法倒着写吗!😀

    再进行观察可以发现,要改变远处的状态需要的移动次数(权值)较大,更能证实是倒着的二进制数。

    Python代码如下:

    from math import sqrt,ceil,gcd,log;re=lambda:map(int,input().strip().split())
    t, = re()
    for _ in range(t):
        n, = re()
        s = input()[::-1]
        print(int(s, 2))
    
    • 0
      @ 2025-4-3 21:53:18

      拿下第一AC

      首先看到有人交了TLE,盲猜实是在模拟,但真的有必要吗?

      让我们不妨进行一下数学推导看题发呆:

      碰到一张正面朝上的牌,将它翻转后停止这次翻牌

      这说明如果要将一张正着的牌翻过来,其前面的牌一定是反面朝下的

      又因为一律从左往右翻牌,那么对于第i张牌,如果它是正的,无论其它牌怎么样,只要处于相同的位置,就有一个相同的次数a[i],代表将其反转所需的次数,那么答案就是所有a[i]之和


      举个栗子:对于"101001000",应进行以下处理(不会markdown,请脑补换行):

      101001000 ans=0 ↓ 001001000 ans+=a[1] ↓ 000001000 ans+=a[3] ↓ 000000000 ans+=a[6]

      ans=a[1]+a[3]+a[6]


      接下来推导a[i],手算可知,这是有规律的:

      a[i]=2^(i-1)


      但我们还可以再深入胡思乱想些

      其实到这里问题就解决了,有没有发现,这不就是二进制吗?把字符串倒序,其十进制的值就是答案 终于,最终代码出炉(请勿复制)——

      n=int(input())
      for _ in range(n):
          input()
          s=input()
          print(int(s[::-1],2))
      
    • 1

    信息

    ID
    1111
    时间
    1000ms
    内存
    256MiB
    难度
    9
    标签
    (无)
    递交数
    30
    已通过
    4
    上传者