编程猫(cat)-2022蜀山区赛初中组第2题

安徽合肥的朋友们看过来啦!!

题目描述

小S是一只会编程的猫。在一个无边无际的棋盘上,它可以按照输入的命令进行移动,命令包含’E’、’S’、’W’、’N’四种,分别对应四个不同的方向,依次为东、南、西、北。当小S执行某个指令时,它会向着对应方向移动一个单位。作为会编程的猫,它不仅可以执行一个命令,还可以执行命令串。对于输入的命令串每一秒它会按照命令执行一个命令。而连续执行完命令串的最后一个命令后,会自动从头开始循环。在0时刻时小S处在(0,0)的位置,并且输入了命令串。现在想要知道T秒后小S所在的位置坐标。

输入格式

从文件 cat.in 中读取数据。

第1行:一个字符串,表示输入的命令串,保证至少有1个命令

第2行:一个正整数T

输出格式

输出到文件 cat.out 中。

一行,两个整数,表示T秒时,小S的坐标

输入输出样例

输入样例1:复制

NSWWNSNEEWN 12

画写样例1:复制

-1 3

说明

【数据范围】

对于60%的数据:T <= 500000且命令串长度 <= 5000

对于100%的数据:T <= 2000000000且命令串长度<= 5000

【说明】

向东移动,坐标改变改变为(X+1,Y);

向南移动,坐标改变改变为(X,Y-1);

向西移动,坐标改变改变为(X-1,Y);

向北移动,坐标改变改变为(X,Y+1);

【耗时限制】1000ms 【内存限制】256MB


这一题啊,应该乍一看很简单,实际也很简单,但是,他有一个问题,会超时!!!

超时对于大家来说并不陌生,在比赛中遇见超时的问题也是很头疼

楼主为大家总结了解决超时的几个方法

1.在搜索中,可以尝试把dfs换成bfs,dijstra堆优化,剪枝操作,双向bfs,这些都是很好用的

2.把万能头换成各种小头文件,加火车头,手动o2优化(这个在考试时一般会帮你开好)

3.运用一些数学方法,如整除特征,同余定理等等

4.把cin换成快读或scanf(scanf一般够用了,不会特意卡你),cout同理

那这道题是不是可以运用一些数学方法呢?

上代码喽

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <sstream>
#include <vector>
using namespace std;
const int dlt[4][2]={{1,0},{0,-1},{-1,0},{0,1}};
string s;
int t;
int main(){
    cin>>s>>t;
    int dx=0,dy=0;
    for(int i=0;i<s.size();i++){
    	int f=0;
        if(s[i]=='E') f=0;
        if(s[i]=='S') f=1;
        if(s[i]=='W') f=2;
        if(s[i]=='N') f=3;
        dx+=dlt[f][0],dy+=dlt[f][1];
    }
    int cum=t/s.size();
    dx*=cum,dy*=cum;
    for(int i=0;i<t%s.size();i++){
    	int f=0;
        if(s[i]=='E') f=0;
        if(s[i]=='S') f=1;
        if(s[i]=='W') f=2;
        if(s[i]=='N') f=3;
        dx+=dlt[f][0],dy+=dlt[f][1];
	}
	cout<<dx<<" "<<dy;
    return 0;
}

  • 16
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值