贴一个抄CCX大佬思路的(但是好好起名的)C++版本 PS:这题a和b最好要分开算,不然要考虑很多种情况,我自己就是这么死的
#include <stdio.h> #include <string.h> const int N = 111; int dx[N] = {0},dy[N] = {0}; char order[N]; //*********************************************** int walk(int ab,int dxy,int dis_xy)//对于一次循环里的每一个状态,计算ab能否到达这一状态,第几次循环到达 { if(dis_xy > 0 && ab >= dxy && (ab - dxy) % dis_xy == 0) return (ab - dxy) / dis_xy;//等于0代表第一次循环就到达 else if(dis_xy < 0 && ab <= dxy && (ab - dxy) % dis_xy == 0) return (ab - dxy) / dis_xy;//等于0代表第一次循环就到达 else if(dis_xy == 0 && ab == dxy) return -2;//-2表示每次都可到达 else return -1;//-1表示无法到达 } /**********************************************/ int main(void) { scanf("%s",order); int len=strlen(order); dx[0] = 0; dy[0] = 0; for(int i = 1; i <= len; i++) //dx,dy的数量比order数加1 { //遍历一次循环里能到达的状态 dx[i] = dx[i-1]; dy[i] = dy[i-1]; switch(order[i-1]) { case 'U': dy[i]++; break; case 'D': dy[i]--; break; case 'L': dx[i]--; break; case 'R': dx[i]++; break; } } int dis_x = dx[len]; int dis_y = dy[len]; //初始化完成 int __; scanf("%d",&__); for(int _ = 0,a,b; _<__; _++) //OJ里单纯用来记问题数的量可以用下划线 { //公司里不行,不然会被打 :) scanf("%d %d",&a,&b); //输入问题 int ans = 0; for(int i = 0;i <= len; i++) { ans = 0; int can_reach_a = walk(a,dx[i],dis_x); int can_reach_b = walk(b,dy[i],dis_y); if(can_reach_a == -1 || can_reach_b == -1)//-1表示无法到达 ans = 0; else if(can_reach_a == -2 || can_reach_b == -2)//-2表示每次都可到达 ans = 1; else if(can_reach_a == can_reach_b)//表示在相同次循环到达 ans = 1; else ans = 0;//表示在不同次循环到达 if(ans) break; } if(ans) printf("Yes\n"); else printf("No\n"); } return 0; }
python在超时的边缘试探
x,y = 0,0 track = {(0,0)} s = input() for c in s: #优雅地遍历只跑一遍能到的点 if c == 'U': y+=1 elif c == 'D': y-=1 elif c == 'L': x-=1 else : x+=1 track.add((x,y)) def f(l,t,xy): #算出能不能到,第几次循环能到 if (xy>0 and l>=t and (l-t)%xy==0) \ or (xy<0 and l<=t and (l-t)%xy==0): return (l-t)/xy elif xy==0 and l==t: return 'any' else: return 'noway' q = int(input()) ans = '(ง •_•)ง' #然后卖个萌 for i in range(q): l=list(map(int,input().split())) for t in track: fu = f(l[0],t[0],x) ck = f(l[1],t[1],y) if fu=='noway' or ck=='noway': ans = 'No' elif fu=='any' or ck=='any': ans = 'Yes' elif fu==ck: ans = 'Yes' else: ans = 'No' if ans == 'Yes': break print(ans)
用pypy勉强能过
YES好判断,NO怎么判断出来的?
using namespace std; const int MAX=1e5+10; int main() { ios::sync_with_stdio(0);cin.tie(0); string s;cin>>s; int i,j,k; int dx=0,dy=0; for(i=0;i<s.size();++i){ if(s[i]=='U') dy+=1; else if(s[i]=='D') dy-=1; else if(s[i]=='L') dx-=1; else dx+=1; } int px[MAX]={0},py[MAX]={0}; int index=1; for(i=0;i<s.size();++i){ if(s[i]=='U'){py[index]=py[index-1]+1;px[index]=px[index-1];index++;} else if(s[i]=='D'){py[index]=py[index-1]-1;px[index]=px[index-1];index++;} else if(s[i]=='L'){px[index]=px[index-1]-1;py[index]=py[index-1];index++;} else {px[index]=px[index-1]+1;py[index]=py[index-1];index++;} } int t;cin>>t; while(t--){ int x,y,flag=0;cin>>x>>y; for(i=0;i<index;i++){ if(dx==0&&dy==0){ if(x==px[i]&&y==py[i]){ cout<<"Yes"<<endl; flag=1;break; } } else if(dx==0&&dy!=0){ if(x==px[i]&&(y-py[i])%dy==0&&(y-py[i])/dy>=0){ cout<<"Yes"<<endl; flag=1;break; } } else if(dx!=0&&dy==0){ if((x-px[i])%dx==0&&(x-px[i])/dx>=0&&y==py[i]){ cout<<"Yes"<<endl; flag=1;break; } } else{ if((x-px[i])%dx==0&&(y-py[i])%dy==0&&(x-px[i])/dx==(y-py[i])/dy&&(x-px[i])/dx>=0&&(y-py[i])/dy>=0){ cout<<"Yes"<<endl; flag=1;break; } } } if(flag==0) cout<<"No"<<endl; } }
贴一个抄CCX大佬思路的(但是好好起名的)C++版本
PS:这题a和b最好要分开算,不然要考虑很多种情况,我自己就是这么死的
python在超时的边缘试探
用pypy勉强能过
YES好判断,NO怎么判断出来的?
include