今日头条18春招算法笔试

存在n+1个房间,每个房间依次为房间1 2 3…i,每个房间都存在一个传送门,i房间的传送门可以把人传送到房间pi(1<=pi<=i),现在路人甲从房间1开始出发(当前房间1即第一次访问),每次移动他有两种移动策略:
A. 如果访问过当前房间 i 偶数次,那么下一次移动到房间i+1;
B. 如果访问过当前房间 i 奇数次,那么移动到房间pi;
现在路人甲想知道移动到房间n+1一共需要多少次移动;

输入描述:

第一行包括一个数字n(30%数据1<=n<=100,100%数据 1<=n<=1000),表示房间的数量,接下来一行存在n个数字 pi(1<=pi<=i), pi表示从房间i可以传送到房间pi。

输出描述:

输出一行数字,表示最终移动的次数,最终结果需要对1000000007 (10e9 + 7) 取模。

输入例子1:

2
1 2

输出例子1:

4

例子说明1:

开始从房间1 只访问一次所以只能跳到p1即 房间1, 之后采用策略A跳到房间2,房间2这时访问了一次因此采用策略B跳到房间2,之后采用策略A跳到房间3,因此到达房间3需要 4 步操作。

复杂度高了 只过了60% 怎么破

import java.util.Scanner;
class Pi{
    int i;
    int pi;
    int c;
    Pi(int i,int pi){
        this.i=i;
        this.pi=pi;
        this.c=1;
    }
    int query(){
        return (this.c%2)==0?this.i+1:this.pi;
    }
}
public  class Main{
    public static void main(String[] args){
        Scanner s=new Scanner(System.in);
        int  num=s.nextInt();
        Pi[] pis=new Pi[num+1];
        for(int  i=1;i<=num;i++){
            pis[i]=new Pi(i,s.nextInt());
        }
        int  count=0;
        int  next=1;
        while(true){
            int tmp=next;
            next=pis[next].query();
            count++;
            if(next==num+1){
                System.out.println(count);
                break;
            }
            pis[tmp].c++;
        }
    }
}  

你可能感兴趣的:(笔试)