AtCoder ContextABC 136 D Gathering Children(孩子们,来吧)

代码骑士
• 阅读 1589

题目
有一些小格子,这些小格子可以被由字符'L'和'R'构成的字符串S所表示。
字符串S的长度为N,也就是说字符串S由N个小格子从左致右,一列排开。从左往右第i个格子的内容是字符串S的从左往右第i个字符。
最左边的格子的内容必须为'R'
最右边格子的内容必须为'L'
最开始的时候,每个格子里面有一个小孩子。
格子里面的小孩子,按照下面的规则移动10的100次方回。

按照现在所属的格子里的字符的意思移动。比如小孩子所在的格子里写着'L'的话,那么这个孩子就往左移动一个格子。如果小孩子所在的格子里写着'R'的话,那么这个小孩子就往右移动一个格子。那么,这样进行1000次以后,求每个格子里小孩子的人数。

条件

输入
要求以下面的方式输入

S

输出
10的100次方回以后,从左到右各个小格子的人数

例1
输入

RRLRL

输出

0 1 2 1 1

解释

  1. 第1次移动后,从左到右每个小格子的人数是0,2,1,1,1
  2. 第2次移动后,从左到右每个小格子的人数是0,1,2,1,1
  3. 这样移动10的100次方回以后,从左到右每个小格子的人数是0,1,2,1,1

例2
输入

RRLLLLRLRRLL

输出

0 3 3 0 0 0 1 1 0 2 2 0

例2
输入

RRRLLRLLRRRLLLLL

输出

0 0 3 2 0 2 1 0 0 0 4 4 0 0 0 0

解题思路

读懂题目

格子是不移动的
刚开始没有读懂题目,以为是格子里面的字母移动,不是这样的

格子上的人是移动的
格子是固定的,格子里面的字母也是固定的,格子里面的人是要根据格子里面的字母,移动到左边的格子或者移动到右边的格子里面的

AtCoder ContextABC 136 D Gathering Children(孩子们,来吧)

RRRLLL
左边的R最多只能移动到右边的第1个L,如图所示,会被右边的L弹回左边的
如图所示,黑色的点最多移动到哪里?

RRRLLL
右边的L最多只能移动到左边的第3个R,如图所示,会被左边的R弹回右边的
如图所示+点最多移动到哪里?

RRRLLL
所有的点都往中间的RL聚集
如图所示,到了第4步的时候,所有的点都聚集往中间了

AtCoder ContextABC 136 D Gathering Children(孩子们,来吧)

10的100次方是一个偶数
可以看出,第4步和第6步都是一样的,第5步和第7步都是一样的
10的100次方,也就是说会移动到第4步的样子

奇数项留下,偶数项过去
第4步可以看到留下有两列
左边的一列留下了什么?
右边的一列留下了什么?

代码


# 按照RL的字符聚合,生成数字的数组聚合
# 进入 RRLLLLRLRRLL
# 输出 [[2,4],[1,1],[2,2]]
def calculate(S):
    result = []
 
    rNum = 0
    lNum = 0
    for i in range(len(S)):
        if S[i] == "L":
            lNum = lNum + 1
        else:
            rNum = rNum + 1
 
        if i > 0:
            if (S[i] == "R") and (S[i-1] == "L"):
                result.append([rNum-1,lNum])
                rNum = 1
                lNum = 0
 
        if i == len(S) - 1:
            result.append([rNum,lNum])
 
    return result
 
 
# 方便生成前面的0
# 比如24 --> 0xy000
def constructZero(n):
    res = ""
    for i in range(n):
        res = res + "0 "
    return res

# 这里生成最后的结果
# 比如24 --> 生成0xy000,顺便求出x和y
def calculate2(arr):
    ret = ""
    for index in range(len(arr)):
 
        # 生成前面的0
        s1 = constructZero(arr[index][0]-1)
        s2 = constructZero(arr[index][1]-1)
 
        if arr[index][0] % 2 == 0:
            l1 = arr[index][0]//2 # 算出留下来的,总数是偶数的话留下一半
        else:
            l1 = (arr[index][0] + 1) // 2 # 算出留下来的,总数是奇数的话,留下奇数的,剩下的给对方
 
        g1 = arr[index][0] - l1 # 剩下一半给对方
 
        if arr[index][1] % 2 == 0:
            l2 = arr[index][1]//2 # 算出留下来的,总数是偶数的话留下一半
        else:
            l2 = (arr[index][1] + 1) // 2 // 2 # 算出留下来的,总数是奇数的话,留下奇数的,剩下的给对方
 
        g2 = arr[index][1] - l2 # 剩下一半给对方
 
        # 拼接结果
        ret = ret + s1 + str(l1 + g2) + " " + str(l2 + g1)+ " " + s2
 
    return ret
 
S = input()
result = calculate(S)
ret = calculate2(result)
print(ret)
点赞
收藏
评论区
推荐文章
Karen110 Karen110
3年前
一篇文章带你了解JavaScript日期
日期对象允许您使用日期(年、月、日、小时、分钟、秒和毫秒)。一、JavaScript的日期格式一个JavaScript日期可以写为一个字符串:ThuFeb02201909:59:51GMT0800(中国标准时间)或者是一个数字:1486000791164写数字的日期,指定的毫秒数自1970年1月1日00:00:00到现在。1\.显示日期使用
美凌格栋栋酱 美凌格栋栋酱
6个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Bill78 Bill78
4年前
Python 字符串常用方法总结
明确:对字符串的操作方法都不会改变原来字符串的值1,去掉空格和特殊符号name.strip()去掉空格和换行符name.strip('xx')去掉某个字符串name.lstrip()去掉左边的空格和换行符name.rstrip()去掉右边的空格和换行符2,字符串的搜索和替换name.count('x')查找某个
DaLongggggg DaLongggggg
4年前
python百题大冲关-确定字符串是否是另一个的旋转
挑战介绍实现一个算法来识别一个字符串s2是否是另一个字符串s1的旋转。旋转的解释如下:如果将s1从某个位置断开,拆分成两个字符串(可能有一个为空字符串),再将这两个字符串调换顺序后拼接起来,能够得到s2,那么说字符串s2是字符串s1的旋转。本次挑战中,你需要在rotation.py文件中补充函数is_subst
Wesley13 Wesley13
3年前
Mysql 查询所有课程的成绩第2名到第3名的学生信息及该课程成绩
 查询所有课程的成绩第2名到第3名的学生信息及该课程成绩1\.查询课程ID为‘01’的课程的成绩第2名到第3名的学生信息及该课程成绩SELECT  d.,c.排名,c.s_score,c.c_idFROM  (SELECTa.s_id,a.s_score,a.c_id,@i:@i1AS排名FROMs
Stella981 Stella981
3年前
LeetCode 5561. 获取生成数组中的最大值
文章目录1\.题目2\.解题1\.题目给你一个整数n。按下述规则生成一个长度为n1的数组nums:nums00nums11当2<2i<n时,nums2inumsi
Stella981 Stella981
3年前
JavaScript常用函数
1\.字符串长度截取functioncutstr(str,len){vartemp,icount0,patrn/^\x00\xff/,strre"";for(vari
Wesley13 Wesley13
3年前
VIM和sed 替换字符串方法
(1)VIM替换字符串方法1\.基本替换:s/str1/str2/替换当前行第一个str1为str2:s/str1/str2/g替换当前行所有str1为str2:n,$s/str1/str2/替换第n行开始到最后一行中每一行的第一个str1为str2:n,$s/str1/str2/g替换第n行开始到最后一行中每
Stella981 Stella981
3年前
LeetCode.1170
这是小川的第412次更新,第444篇原创<br/看题和准备今天介绍的是LeetCode算法题中Easy级别的第263题(顺位题号是1170)。在一个非空字符串s上定义一个函数f(s),该函数计算s中最小字符的出现频率。例如,如果s"dcce",则f(s)2,因为最
贾蔷 贾蔷
2星期前
2024蓝桥杯国赛B组最小字符串题解:贪心算法实战应用
一、题目解读题目要求给定一个长度为N的S和M个待插入字符,通过将这些字符全部插入S中,构造出最小的新字符串。这是典型的字符串构造问题,考察选手对的理解和应用能力。二、解题思路采用贪心策略:1.先将待插入字符,便于按字典序选择2.遍历原字符串时,在保证字典序
深度学习 深度学习
1星期前
2024年蓝桥杯国赛B组最小字符串(洛谷P10910):贪心算法构造最小字符串
一、问题描述给定一个长度为N的S和M个待插入字符,要求将这些字符全部插入到S中,使得最终形成的字符串最小。二、完整代码解析(含详细注释)Cincludeincludeincludeusingnamespacestd;intmain()intN,M;st