当前位置: 首页 > 后端技术 > Python

AtCoderContextABC136DGatheringChildren(小朋友,加油)

时间:2023-03-26 16:49:26 Python

title有一些小格子,这些小格子可以用一个由字符'L'和'R'组成的字符串S来表示。字符串S的长度为N,也就是说字符串S由N个小格子组成,从左到右排成一列。从左到右第i个格子的内容是字符串S从左到右第i个字符,最左边格子的内容必须是'R',最右边格子的内容必须是'L'一开始,每个格子里都有一个孩子。格子中的孩子们按照以下规则移动10的100次方。根据当前所属单元格中字符的含义移动。例如,如果孩子所在的格子里写了'L',那么孩子就会向左移动一格。如果孩子所在的格子里写了'R',那么孩子就向右移动一格。然后,这样做1000次后,找出??每个格子中的孩子数量。条件输入要求S按如下方式输入,输出10的100次方,每个小格子从左到右的人数例1输入RRLRL输出01211说明第一次走后,每个从左到右边的小格子里的人数是0,2,1,1,1。第二次走完后,从左到右每个小格子里的人数是0,1,2,1,1。之后移动10的100次方,每个小格子的人数从左到右依次为0,1,2,1,1例2输入RRLLLRLLLRRRLL输出033000110220例2输入RRLLRLLLRRRLLLL输出0032021000440000解题思路。理解问题。格子不动。一开始,我不明白这个问题。我以为是网格中的字母移动了。事实并非如此。网格上的人移动。网格是固定的。里面的字母也是固定的,格子里的人要根据格子里的字母向左格子或者向右格子移动。左边R中的RRRLLL最多只能移动到右边第一个L,如图所示,会被右边的L弹回来。如左图所示,黑点最多移动到哪里?RRRLLL右边的L最多只能移动到左边的第三个R,如图,会被左边的R反弹回图中右边的那个+wherecan点最多移动?RRRLLL所有的点都聚集到中间的RL,如图所示。到了第四步,所有的点都向中间聚集。10的100次方是偶数。一样的,第5步和第7步是一样的10的100次方,也就是说会移动到第4步。列左侧的列的左侧是什么?右边那一列的左边是什么?代码#根据RL的字符聚合,生成数字的数组聚合#enterRRLLLLLRLRRLL#output[[2,4],[1,1],[2,2]]defcalculate(S):result=[]rNum=0lNum=0foriinrange(len(S)):ifS[i]=="L":lNum=lNum+1else:rNum=rNum+1ifi>0:if(S[i]=="R")和(S[i-1]=="L"):简历lt.append([rNum-1,lNum])rNum=1lNum=0ifi==len(S)-1:result.append([rNum,lNum])returnresult#方便生成前面的0#比如24-->0xy000defconstructZero(n):res=""foriinrange(n):res=res+"0"returnres#在这里生成最终结果#比如24-->生成0xy000,顺便找到x和ydefcalculate2(arr):ret=""forindexinrange(len(arr)):#generatetheprevious0s1=constructZero(arr[index][0]-1)s2=constructZero(arr[index][1]-1)ifarr[index][0]%2==0:l1=arr[index][0]//2#计算剩下的,如果总数是偶数,留一半else:l1=(arr[index][0]+1)//2#计算剩下的,如果总数是奇数,就保留奇数,剩下的给对方g1=arr[index][0]-l1#把另一半给对方ifarr[index][1]%2==0:l2=arr[index][1]//2#计算剩下的,if总数是偶数,留下一半else:l2=(arr[index][1]+1)//2//2#计算剩下的,如果总数是奇数,保留奇数,剩下的给对方g2=arr[index][1]-l2#剩下的一半给对方#拼接结果ret=ret+s1+str(l1+g2)+""+str(l2+g1)+""+s2返回retS=input()result=calculate(S)ret=calculate2(result)print(ret)