70分,看一天了,实在找不出来错误了,谢谢

P1563 [NOIP2016 提高组] 玩具谜题

@[thliup](/user/1166079) 首先您数组和字符串开小了,都开到 100005 能 90。
by 冰糖鸽子 @ 2023-12-21 16:22:51


@[thliup](/user/1166079) 然后注意到向右/左数的时候,直接取模在数到第 $n$ 个小人的时候被认为数到了第 $0$ 个小人。 正确代码如下。 ```cpp #include<iostream> #include<iomanip> #include<cmath> #include<algorithm> #include<stdbool.h> #include<stdio.h> #include<cstring> using namespace std; int main() { int n, m; cin >> n >> m; int a[100005][10] = { 0 },b[100013] = { 0 }, ans = 1; // 开大数组 string s[100005]; // 同上 for (int i = 1; i <= n; i++) { cin >> b[i]; cin >> s[i]; } for (int i = 1; i <= m; i++) { for (int j = 1; j <= 2; j++) { cin >> a[i][j]; } if (a[i][1] == 0 && b[ans] == 0 || a[i][1] == 1 && b[ans]==1) { ans = (n + ans - a[i][2]); // 先不取模 } else ans = (ans + a[i][2]); // 先不取模 if(ans>n) ans-=n; // 可以自己模拟一下,可以发现这样是对的 } cout << s[ans] << endl; return 0; } ```
by 冰糖鸽子 @ 2023-12-21 16:25:28


@[冰糖鸽子](/user/227728) 麻烦你了,请问一下,如果先取余,是哪里错了呢,谢谢你
by thliup @ 2023-12-22 20:06:32


@[thliup](/user/1166079) 额我觉得我说了 `直接取模在数到第 n 个小人的时候被认为数到了第 0 个小人。`
by 冰糖鸽子 @ 2023-12-22 20:09:01


@[冰糖鸽子](/user/227728) 我的问题
by thliup @ 2023-12-22 20:44:51


|