和大家一样wa了4,求助苣佬 QWQ

P1563 [NOIP2016 提高组] 玩具谜题

2 1 0 First 1 Second 0 1 你这组没有输出,可以看看忽略了哪里 @[koukis](/user/476684)
by Fish_Clever @ 2021-08-19 09:29:17


@[1093725598yr](/user/104918) 好好,我先看看
by koukis @ 2021-08-19 09:29:59


```cpp #include<bits/stdc++.h> #include<string> #include<iostream> #include<cstdio> using namespace std; int n,m; struct T{ int d; string name; }a[100005]; int work(int k,int x,int y) { if(x==0)//往左 { if(a[k].d==0)//朝内 { if(k-y<0) return n-(y-k); else return k-y; } else//朝外 { if(k+y>n) return k+y-n; else return k+y; } } else//往右 { if(a[k].d==0)//朝内 { if(k+y>n) return k+y-n; else return k+y; } else//朝外 { if(k-y<0) return n-(y-k); else return k-y; } } } int main() { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) { scanf("%d",&a[i].d); cin>>a[i].name; } int flag=0; if(n==2) { for(int i=1;i<=m;i++) { int x,y; scanf("%d%d",&x,&y); if(y%2==0) int flag=1; else int flag=2; } if(flag=2) cout<<a[2].name; else cout<<a[1].name; } else { int k=1; for(int i=1;i<=m;i++) { int x,y; scanf("%d%d",&x,&y); k=work(k,x,y); } cout<<a[k].name; } return 0; } ``` 加了一个特判,但是还是wa了4 有没有大佬可以帮忙改改qwq 蒟蒻实在太弱了
by koukis @ 2021-08-19 09:53:02


@[1093725598yr](/user/104918) 好像不是这个问题,也有可能是我太弱了 还是wa了4呢? 可以帮忙看看嘛??qwq
by koukis @ 2021-08-19 10:03:38


好的,我再看看哈@[koukis](/user/476684)
by Fish_Clever @ 2021-08-19 10:09:23


@[1093725598yr](/user/104918) 嗯嗯,太谢谢dalao了
by koukis @ 2021-08-19 10:11:20


@koukis我之前不是这个意思... 3 1 0 First 0 Second 0 Third 0 1 类似的,这组数据你这样不还是没有输出。。。 这并不是特判,是你work中的下标错了。。。 你读入时的下标为1~n,但是可能会return 0(work中),所以要么改下读入,要么work中再考虑考虑,我这也把两种做法都写一下。
by Fish_Clever @ 2021-08-19 10:15:16


@[1093725598yr](/user/104918) 可以具体说一下吗? 这样说我还是有点迷糊,或者在我的code上面改一下,我看一下是怎么回事
by koukis @ 2021-08-19 10:24:18


@[koukis](/user/476684) ```cpp #include<bits/stdc++.h> #include<string> #include<iostream> #include<cstdio> using namespace std; int n,m; struct T{ int d;string name; }a[100005]; int work(int k,int x,int step) { /* 往左+朝内:0 , 0 -> 往小走 往左+朝外:0 , 1 -> 往大走 往右+朝内:1 , 0 -> 往大走 往右+朝外:1 , 1 -> 往小走 综上所述, (x^a[k].d) == 0 往小走 else 往大走 首先这样可以简化代码. */ if((x^a[k].d)==0)//往小走. { if(step<=k-1)//从第k个小人开始走,不会走过第一个小人(因此最多走k-1步). return k-step; else{//第k个小人先走到第n个小人(走过1了),花费了k步. step-=k,k=n; return k-step; } } else//往大走. { if(k+step<=n) return k+step; else{//先走过第n个小人,走到1,再继续走. step=step-(n-k+1),k=1; return k+step; } } } int main() { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) { scanf("%d",&a[i].d); cin>>a[i].name; } int k=1; for(int i=1,x,y;i<=m;i++) scanf("%d%d",&x,&y),k=work(k,x,y); cout<<a[k].name; return 0; } ```
by Fish_Clever @ 2021-08-19 10:29:38


@[1093725598yr](/user/104918) 谢谢大佬 orz %%%
by koukis @ 2021-08-19 10:31:26


|