Pokémon GO II
Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 106 Accepted Submission(s): 29
Problem Description
众所周知,度度熊最近沉迷于 Pokémon GO。
由于太过沉迷,现在它只能按照游戏内置的指令行走了:对,简直就像一个现实中的Pokémon!
游戏内置的指令实际上可以抽象成一种:保持现在的朝向前行X米,然后右转。度度熊相信,只要遵循这个指令,它就一定可以抓到最珍奇的精灵球。
但不幸的是,这个指令并不是很有可信度,有时会引导度度熊走回原来的位置。现在它想知道,在第几条指令时它第一次回到已经走过的位置?如果这种情况没有发生,请输出 “Catch you”。
由于太过沉迷,现在它只能按照游戏内置的指令行走了:对,简直就像一个现实中的Pokémon!
游戏内置的指令实际上可以抽象成一种:保持现在的朝向前行X米,然后右转。度度熊相信,只要遵循这个指令,它就一定可以抓到最珍奇的精灵球。
但不幸的是,这个指令并不是很有可信度,有时会引导度度熊走回原来的位置。现在它想知道,在第几条指令时它第一次回到已经走过的位置?如果这种情况没有发生,请输出 “Catch you”。
Input
第一行为T,表示输入数据组数。
每组数据的第一行包含一个数N,表示指令长度。接着的一行包含N个数字Xi,表示第i个指令中前行的距离。
● 1≤T≤100
● 1≤N≤1 000 000
● 1≤Xi≤1 000 000 000
每组数据的第一行包含一个数N,表示指令长度。接着的一行包含N个数字Xi,表示第i个指令中前行的距离。
● 1≤T≤100
● 1≤N≤1 000 000
● 1≤Xi≤1 000 000 000
Output
对每组数据输出第一次回到已经走过的位置时的指令下标i (1≤i≤N)。
如果这种情况没有发生,请输出 “Catch you”。
如果这种情况没有发生,请输出 “Catch you”。
Sample Input
3
4
2 2 2 2
4
2 1 3 1
5
2 1 3 1 3
Sample Output
4
Catch you
5
Source
Recommend
情况2只会产生一次,之后不会再有了,这个多画几个图就能知道。
然后是可以用对4取模来找边存边。
#include<bits/stdc++.h>
using namespace std;
int main()
{
if (fopen("in.txt", "r") != NULL)
{
freopen("in.txt", "r", stdin);
// freopen("out.txt", "w", stdout);
}
int t ;
cin>>t;
while(t--)
{
int n;
scanf("%d",&n);
int x[4]={0};
long long limit[4]={1e18,1e18,1e18,1e18};
int ans=0;
bool flag=false;
for(int i=0;i<n;i++)
{
int xi;
scanf("%d",&xi);
if(ans) continue;
if(xi>=limit[i%4]) ans=i+1;
if(xi<=x[(i+2)%4])
{
if(i<4) flag=true;
if(xi<x[(i+2)%4]-x[i%4]||flag==true)
limit[(i+1)%4]=x[(i+3)%4];
else limit[(i+1)%4]=x[(i+3)%4]-x[(i+1)%4];
flag=true;
}
x[i%4]=xi;
}
if(ans) printf("%d\n",ans);
else puts("Catch you");
}
return 0;
}