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

开始做这道题,一直卡在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

相关推荐

Pandaileee:校友加油我现在也只有一个保底太难了
点赞 评论 收藏
分享
10-27 17:26
东北大学 Java
点赞 评论 收藏
分享
粗心的雪碧不放弃:纯学历问题,我这几个月也是一直优化自己的简历,后来发现优化到我自己都觉得牛逼的时候,发现面试数量也没有提升,真就纯学历问题
点赞 评论 收藏
分享
4 14 评论
分享
牛客网
牛客企业服务