猫史档案馆


【题解】 猫站OJ1366 乒乓球

用户:Hctr127Hctr127查看:0 回复:2 评论:0 创建时间:2023-02-19T20:04:46


题面

描述
有一个管道,管道里面有一个乒乓球,乒乓球上写着一个正整数m。
现在,你要连续进行n次如下操作:首先,从管道的最左边拿出一个乒乓球,计算乒乓球上的数与123456的乘积。随后,从低位至高位切割这个乘积,每三位写在一个乒乓球上,并从管道最右边放入管道。
例如,若你拿出的球上标有数字“3”,则乘积为370368,切割为“368”和“370”并放入管道。再例如,若你拿出的球上标有数字“368”,则乘积为45431808,切割为“808”、“431”和“45”并放入管道。
n次操作后,我希望知道管道最左侧的乒乓球上标的数字是多少。

输入
仅一行,包含两个正整数n和m
输出
仅一个整数,表示n次操作后管道最左侧的乒乓球上的数字是多少。
输入样例 1
2 3
输出样例 1
370
提示
数据规模和约定
n<100000,m<1000

解析

题目描述中已经对样例进行了解释
“例如,若你拿出的球上标有数字“3”,则乘积为370368,切割为“368”和“370”并放入管道。再例如,若你拿出的球上标有数字“368”,则乘积为45431808,切割为“808”、“431”和“45”并放入管道。”

具体画成图是这样的

乒乓球筒可以看作是一个队列,取出的过程可以看作是出队,放回的过程可以看成是入队,将这个过程循环n次就能AC了。

AC Code

C++

c++

#include <iostream>//输入输出流,没得说
#include <queue>//任何数据结构终将被STLAC!
using namespace std;

int main()
{
queue<int> ball;//STL队列创建
int m,n;
cin>>n>>m;
ball.push(m);//push,即STL队列的入队操作
int temp=ball.front();//front,获取队列的第一个元素
for(int i=0;i<n;i++)//此段为砍数位,循环n次
{
temp=ball.front()*123456;
while (temp!=0)
{
ball.push(temp%1000);//将后三位进行入队操作
temp/=1000;//砍掉后三位
}
ball.pop();//弹出第一位
}
cout<<ball.front();//输出第一位
return 0;//防止RE(伦敦大雾)
}

 Python (不能AC)

import queue#Python队列STL(实际上这个模块不仅有我们需要使用的FIFO队列,也有栈和优先队列)
ball=queue.Queue()#创建队列
s=input().split()#输入,没得说
n=int(s[0])
m=int(s[1])
ball.put(m)#put,STL队列入队操作
temp=0
for i in range(n):
temp=ball.get()*123456#出队操作,并返回出队的元素
while(temp!=0):
ball.put(temp%1000)#入队后三位
temp=temp//1000#砍掉后三位
print(ball.get())#输出


Python本来运行效率低下,交上去会有5个点TLE,如果你有优化的方法,可以回帖补充


回复

上一页1 页 / 共 1下一页
爱玩游戏的大豆爱玩游戏的大豆

为什么没有缩进啊qwq

 

点赞0


评论


爱玩游戏的大豆爱玩游戏的大豆

center_imagec++那个也不能ac!!!

 

点赞0


评论