列表

详情


ZJ1. 附加题

描述

存在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

输出:

4

说明:

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

原站题解

C 解法, 执行用时: 1ms, 内存消耗: 308KB, 提交时间: 2021-09-12

#include<stdio.h>
int step(int*a,int n){
    int dp[n+1];
    memset(dp,0,sizeof(dp));
    int mod=1e9+7;
    for(int i=1;i<=n;i++){
        dp[i]=(2*dp[i-1]%mod-dp[a[i-1]-1]+2)%mod;
    }
    return dp[n];
}
int main(){
    int n;
    scanf("%d",&n);
    int a[n];
    for(int i=0;i<n;i++){
        scanf("%d",&a[i]);
    }
    int s=step(a,n);
    printf("%d",s);
    return 0;
}

C 解法, 执行用时: 1ms, 内存消耗: 372KB, 提交时间: 2020-08-16

#include <stdio.h>


int step(int *a, int n)
{
    int dp[n + 1];
        memset(dp, 0, sizeof(dp));
        int mod = 1e9 + 7;
     for(int i = 1; i <= n; i++)
     {
         dp[i] = (2 * dp[i - 1] % mod  - dp[a[i - 1] - 1] + 2)%mod;
     }
    return dp[n];
}

int main()
{
    int n;
    scanf("%d", &n);
    int a[n];
    for(int i = 0 ; i < n; i++)
    {
        scanf("%d", &a[i]);
    }
    int s = step(a, n);
    printf("%d",s);
    return 0;
}

C 解法, 执行用时: 1ms, 内存消耗: 416KB, 提交时间: 2020-08-08

#include <stdio.h>


int step(int *a, int n)
{
    int dp[n + 1];
        memset(dp, 0, sizeof(dp));
        int mod = 1e9 + 7;
     for(int i = 1; i <= n; i++)
     {
         dp[i] = (2 * dp[i - 1] % mod  - dp[a[i - 1] - 1] + 2)%mod;
     }
    return dp[n];
}

int main()
{
    int n;
    scanf("%d", &n);
    int a[n];
    for(int i = 0 ; i < n; i++)
    {
        scanf("%d", &a[i]);
    }
    int s = step(a, n);
    printf("%d",s);
    return 0;
}

C 解法, 执行用时: 2ms, 内存消耗: 300KB, 提交时间: 2022-03-04

#include<stdio.h>
 long long p[1001],dp[1001],n;
  const long long mod=1000000007;
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%d",&p[i]);
    }
    for(int i=2;i<=n+1;i++)
        dp[i]=(2 * dp[i-1] - dp[p[i-1]] + 2) % mod;
   if(dp[n+1]<0)
        printf("%d",dp[n+1]+mod);
    else
        printf("%d",dp[n+1]);
        return 0;
}

C 解法, 执行用时: 2ms, 内存消耗: 304KB, 提交时间: 2021-09-16

#include<stdio.h>
long long int mod = 1e9+7;
int main(){
    long long int n;
    scanf("%lld", &n);
    int pi[n+1];
    for(int i = 1; i <= n; ++i){
        scanf("%d", &pi[i]);
    }
//     int accessCount[n+1];
//     for(int i = 1; i <= n; ++i){
//         accessCount[i] = 0;
//     }
//     long long int count = 0;
//     for(int i = 1; i <= n;){
//         accessCount[i] += 1;
//         count = count + 1;
//         if(accessCount[i] % 2 > 0){
//             i = pi[i];
            
//         }else{
//             ++i;
//         }
        
//     }
//     printf("%lld\n", count);
    long long int dp[n+1];
    for(int i = 0; i <= n + 1; ++i){
        dp[i] = 0;
    }
    for(int i = 2; i <= n + 1; ++i){
        dp[i] = (2 * dp[i - 1] - dp[pi[i - 1]] + 2) % mod;
    }
    printf("%lld\n", dp[n+1] > 0 ? dp[n + 1] : dp[n + 1] + mod);
    return 0;
}

上一题