题目传送门
解题思路
首先,我们直接根据题意模拟:
- 若 y = 1 y=1 y=1,将 x x x 增加 1 1 1,若 a x > 0 a_x>0 ax>0,将 y y y 的值变为 − 1 -1 −1,否则 y y y 不变,最后将 a x a_x ax 减少 1 1 1。
- 若 y = − 1 y=-1 y=−1,将 x x x 减少 1 1 1,若 b x > 0 b_x>0 bx>0,将 y y y 的值变为 1 1 1,否则 y y y 不变,最后将 b x b_x bx 减少 1 1 1。
然后,我们就会超时 5 5 5 个点。
我看见好多人比赛时得了20分,我压根不知道20分的代码怎么写
CODE:
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int a[N], b[N];
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int t;
cin >> t;
while (t--) {
int n;
cin >> n;
int x = 0, y = 1;
for (int i = 1; i <= n; i++) {
cin >> a[i] >> b[i];
}
while(1) {
if (y == 1) {
x++;
if (a[x] > 0)
y = -1;
a[x]--;
}
if (y == -1)
{
x--;
if (b[x] > 0)
y = 1;
b[x] --;
}
if (x == 0 && y == -1 || x == n + 1 && y == 1)
{
printf("%d\n", x);
break;
}
}
}
return 0;
}
然后我们就进行优化,经过多组数据的模拟,我们可以想到用前缀和的思想来做。
我们可以想一想,首先, a x a_x ax 和 b x b_x bx 的当前总和谁大,就影响到最终的结果,只要 a x a_x ax 的和大于过 b x b_x bx 的和 1 1 1 次,最终的位置就一定为 0 0 0,否则,最终的位置就一定为 n + 1 n+1 n+1。
CODE:
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int a[N], b[N];
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int t;
cin >> t;
while (t--) {
int n;
cin >> n;
int x = 0, y = 1;
int ans = 0, res = 0;
bool flag = false;
for (int i = 1; i <= n; i++) {
cin >> a[i] >> b[i];
ans += a[i];
if (ans > res)
flag = true;
res += b[i];
}
if (flag)
puts("0");
else
printf("%d\n", n + 1);
}
return 0;
}