ACGO首AC的GO
2024-05-12 18:12:08
发布于:上海
19阅读
0回复
0点赞
这道题有一个思路:直接上手模拟,代码如下
#include<iostream>
#include<string>
using namespace std;
string s;
int t,x,y;
int main(){
cin>>s>>t;
int i=0;
while(i<t){
char c=s[i%s.size()];
if(c=='N')y++;
if(c=='S')y--;
if(c=='E')x++;
if(c=='W')x--;
i++;
}
cout<<x<<" "<<y;
return 0;
}
但是这样明显是行不通的,因为时间太长了,测试会有4个TLE
我们分析一下:如果命令字符串执行完一轮之后,它会固定在x、y两轴上进行移动,于是乎我们可以进行一个预处理:
#include<iostream>
#include<string>
using namespace std;
string s;
int t,x,y,xmove,ymove;
int main(){
cin>>s>>t;
for(int i=0;i<s.size();i++){
char c=s[i];
if(c=='N')ymove++;
if(c=='S')ymove--;
if(c=='E')xmove++;
if(c=='W')xmove--;
}
int turn=t/s.size();
x+=turn*xmove,y+=turn*ymove;
int i=0;
while(i<t%s.size()){
char c=s[i%s.size()];
if(c=='N')y++;
if(c=='S')y--;
if(c=='E')x++;
if(c=='W')x--;
i++;
}
cout<<x<<" "<<y;
return 0;
}
这里的代码将一轮执行完的命令进行了预处理,也就是说先计算出来它一共执行几轮,还剩下多少命令,接下来就按照数学中的被除数=商*除数+余数
的思路得到公式移动的步数=执行命令的轮数(向下取整)*每轮命令移动的步数+还要移动的步数(不足一轮)
然后编程实现
这里空空如也
有帮助,赞一个