C 哈克朗克挑战赛

C 哈克朗克挑战赛,c,algorithm,timeout,C,Algorithm,Timeout,嘿,我只是想解决hackerrank上的一个挑战,但是在一些测试案例中,代码超时了,我不知道为什么 这是我的代码: #include <math.h> #include <stdio.h> #include <string.h> #include <stdlib.h> #include <assert.h> #include <limits.h> #include <stdbool.h> int main(){

嘿,我只是想解决hackerrank上的一个挑战,但是在一些测试案例中,代码超时了,我不知道为什么

这是我的代码:

#include <math.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>
#include <limits.h>
#include <stdbool.h>

int main(){
    int n, k, q; 
    scanf("%d %d %d",&n,&k,&q);
    int qs[q];
    int a[n];

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


    for(int i = 0; i < q; i++){
        scanf("%d",&qs[i]);
    }

    int lastNbr = a[n-1];
    for(int i = 0; i < k; i++){
        lastNbr = a[n-1];
        for(int j = n - 1; j > -1; j--){
            a[j] = (j-1 >= 0) ? a[j-1] : lastNbr;
        }
    }

    for(int i = 0; i < q; i++){
        printf("%d\n", a[qs[i]]);
    }

    return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
int main(){
int n,k,q;
scanf(“%d%d%d”,&n,&k,&q);
int-qs[q];
int a[n];
对于(int i=0;i-1;j--){
a[j]=(j-1>=0)?a[j-1]:lastNbr;
}
}
对于(int i=0;i
好的,让我们从分析算法的时间复杂度开始:

您有两个嵌套的for循环,当您旋转数组
k
次时,它们总是执行
n*k
操作,您需要
n
操作来进行旋转

这被称为
O(n*k)
,因此它是关于对最坏情况输入的
10^10
操作,这对于这个任务来说太多了

请先阅读关于如何计算算法复杂度的文章,因为它提供了非常有用的信息,并用实际例子进行了解释

现在,您必须重新考虑您的算法并获得更好的时间复杂度。我不会破坏您的解决方案,但我可以给您一个提示:如果您真的不需要按
1
单位旋转数组
k
次,您可以只按
k
单位旋转一次


希望这对你有所帮助,祝你在解决挑战时好运!:)

如果你看一下你的代码,那就是o(n*k)解决方案。你可以在o(n)时间内解决它。输入大小为10POW5,这就是为什么会出现超时错误的原因这将帮助您解决问题。

正如您所写:您正试图解决这个问题。如果我们这样做,那就不公平了…-你有什么特别的问题吗?秘密是你不需要旋转数组;
%
操作符是您的朋友。@Olaf我的意思是,当我提交代码时,大多数测试用例都在工作,但有些超时。如果您能告诉我超时发生在代码的哪一部分,那就太好了。:)代码执行未在要求的时间内完成,执行此操作是挑战的一部分。如果它甚至在测试用例上也超时,那么您需要认真反思算法。如果您无法解决问题,这就是为什么社论会出现的原因。请注意,部分挑战是OP要在要求的时间内完成执行-如果他/她不能完成,那么他/她失败了。如果我们为他/她回答,他们学到了什么(除了寻求帮助比学习自己容易之外)我没有破坏解决方案,我只是给出了一个提示和一篇关于研究时间复杂性的文章。也许他/她还不具备所有这些知识,也不知道从哪里开始学习。此外,如果你不能找出问题的解决方案,你会要求一个提示,而不是花更多的时间在上面。就我个人而言,我认为对一个问题思考太久,即使你在1-2周后就解决了它,也会浪费很多时间。@VladTarniceru非常感谢你的帮助。是的,我在这个算法方面是个新手,所以我在这方面没有太多的知识。我刚刚开始学习c。@VladTarniceru我花了1-2周的时间来解决一些难题。有些我解决了,有些我没有。在这个过程中,我对这个话题有了深入的了解。这是在“娱乐”的标题下,所以我认为没有一件事浪费时间:就像失去了渔获量的渔夫一样,这一切都是为了“在那里”的乐趣,以及希望抓住这个机会。“我在一个问题上花了最长的时间是2个月。是的,我同意,在一个问题上花更长的时间思考确实很有趣,但有时你必须知道什么时候该说“停下来,我会要求提示”。大多数人实际上没有两周的时间来解决一个问题,因为整个过程太慢了。我13岁的时候就拥有了世界上所有的时间,开始学习算法,但是现在,如果我最多3个小时都不能找到一个问题的解决方案,我会看看这个解决方案。只是我没有那么多时间,我想涵盖大多数话题。