题述:
这道题的思路比较简单。但是要求求当每个点作为起始点时,一开始连续的1的个数。一开始我用了单链表,通过改变头尾指针来实现旋转,复杂度为O(n^2),超时了。我以为是单链表操作费时,于是改用数组,用index做指针++,当Index>数组下标最大值i而计数还不够i个时,index=0,继续。但是还是超时。于是最后,我不再让每个点都挨个绕圈判定1的个数,而是当上一个数的ans值>0时,这个数的ans就等于上一个ans–,直到上一个数ans值为0,意味着这个数不是1.再按原来方法统计下一个数的ans值。AC
package _20190518;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.StreamTokenizer;
public class D {
public static void main(String args[]) throws IOException {
StreamTokenizer in=new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
PrintWriter out=new PrintWriter(System.out);
in.nextToken();
int n=(int)in.nval;
int[]a=new int[n];
for(int i=0;i<n;i++) {
in.nextToken();
a[i]=(int)in.nval;
}
int[]ans=new int[n];
for(int i=0;i<n;i++) {
if(a[i]==1) {
ans[0]++;
}else break;
}
int index=0;
for(int i=1;i<n;i++) {
if(ans[i-1]!=0) {
ans[i]=ans[i-1]-1;
}else {
index=i;
for(int j=0;j<n;j++) {
if(index==n) {
index=0;
}
if(a[index]==1) {
ans[i]++;
index++;
}else {
break;
}
}
}
}
for(int i=0;i<n;i++) {
if(ans[i]==n) {
if(n%2==0) {
for(int j=0;j<n;j++) {
out.println("Second");
}
break;
}else {
for(int j=0;j<n;j++) {
out.println("First");
}
break;
}
}else
if(ans[i]%2==0) {
out.println("First");
}else {
out.println("Second");
}
}
out.flush();
}
}