腾讯笔试第五题,让我有了新发现。

开始做这道题,一直卡在50%样例那里,最开始没有mod通知,50%后面应该是答案为负数了。后面加了mod后,50%提示超时,改了多久都没改过来,最后20s,我改了两行代码,就直接ac了。

如图,就改了求和的代码,将第一个圈的代码,改成了第二个圈的写法,就不超时了,真的是发现了新大陆啊。

附ac代码,代码写的乱,不要吐槽我。解题思路就是:
假设k=2,dp[i]表示i朵花的放法,如果k=2,i=3;
则末尾结束的花有两种: **红,*白白,即dp[i] = dp[i-1]+dp[i-k],前提是i-k要>=0,否则不加dp[i-k];
后面算个sum总数就行。
package leetcode.tencent9_1;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;
import java.math.BigInteger;
import java.util.Scanner;

/**
 * P5
 * create by chenshihang on 2019/9/1
 */
public class P5 {


    static long mod = 1000000007;
    static long[] dp = new long[100005];
    static int k;
    public static void main(String[] args) throws IOException {

        Scanner in = new Scanner(System.in);
        int n = in.nextInt();k = in.nextInt();
        int a,b;
        initDp(100004);

        for(int i=0;i<n;i++){
            a = in.nextInt();
            b = in.nextInt();
            m1(a,b);
        }


    }

    public static void initDp(int n){

        if(k==0){
            //特殊处理;都为1;
            for(int i=0;i<=n;i++){
                dp[i]=1;
            }
            return;
        }
        dp[0]=1;
        if(k==1){
            dp[1]=2;
            dp[2]=4;
        } else {
            dp[1]=1;
            if(k>2){
                dp[2]=1;
            }else {
                dp[2]=2;
            }
        }
        for(int i=3;i<=n;i++){
            dp[i]+=dp[i-1];
            dp[i]%=mod;
            if(i-k>=0){
                dp[i]+=dp[i-k];
                dp[i]%=mod;
            }
        }


    }
    public static void m1(int ai,int bi){
        int i;
        long sum = 0;
        for(i=ai;i<=bi;i++){
//            sum = (sum+dp[i])%mod;

            sum = sum+dp[i];
            if(sum>=mod){
                sum%=mod;
            }
        }
        System.out.println(sum);
    }





}


#腾讯##笔试题目#
全部评论
应该mod操作很消耗性能,能不mod就别mod。。
点赞 回复 分享
发布于 2019-09-01 22:39
这题题目好像没说取模?
点赞 回复 分享
发布于 2019-09-01 22:42
还有取模?没看到通知诶
点赞 回复 分享
发布于 2019-09-01 22:46
哇,我就是第一种写法,超时,过50%,万恶的取余,不过学到了新方法
点赞 回复 分享
发布于 2019-09-01 22:47
不对啊,连续的如果出现在中间呢?
点赞 回复 分享
发布于 2019-09-01 22:52

相关推荐

贺兰星辰:不要漏个人信息,除了简历模板不太好以外你这个个人简介是不是太夸大了...
点赞 评论 收藏
分享
重生2012之我是java程序员:换个稍微正式点的照片吧
点赞 评论 收藏
分享
联通 技术人员 总包不低于12
点赞 评论 收藏
分享
4 14 评论
分享
牛客网
牛客企业服务