题意
一条数轴上有若干只兔子。每只兔子处在不同的点上。在外围(两端)的兔子可以跳到任意其他两个兔子之间。求最多能跳多少步。注意:任何时候都不可能存在两只兔子在一个点上。
思路
WA了四发才A。。。自己还是太渣了。画出数轴跳了几下(雾)之后,发现只要前面的兔子跳到下一个兔子的下一个相邻位置,就可以保证第2个兔子之后的空点全部可以跳到。如图所示。
图中实心黑点代表数轴中的点,空心蓝圈代表兔子的初始位置,黑色箭头代表第一阶段跳,粉色箭头代表第二阶段跳。
由此可以看出,第一阶段跳了一次之后,就有三个兔子连在了一起。之后头部的兔子就可以跳到下一个空点,以此类推。这样,第二个兔子以后的所有点都可以跳到。直接统计出第二个兔子之后有多少个空点即可。
但是,这并不是最终答案。我也因为这个WA了好几发。请看下图。
答案是3?显然不对。这时,从尾部向前跳能得到更大的结果,最终结果为6。
综上所述,先正向建立数轴,统计出第二个兔子之后有多少空点。再反向建立数轴,做同样的事情。最后取这两个值的最大值,就是答案。
代码
#include <cstdio>
int A[505];
int main() {
int T;
scanf("%d", &T);
while (T--) {
int N;
scanf("%d", &N);
int ans1 = 0, ans2 = 0;
for (int i=0; i<N; i++) {
scanf("%d", &A[i]);
}
for (int i=2; i<N; i++) {
ans1 += A[i]-A[i-1]-1;
}
for (int i=N-3; i>=0; i--) {
ans2 += A[i+1]-A[i]-1;
}
printf("%d\n", ans1 > ans2 ? ans1 : ans2);
}
return 0;
}