繁体   English   中英

如何解决“超出时间限制”错误?

[英]How to solve "Time Limit Exceeded" error?

我最近在 codeforces.com 上练习,我在那里解决了一个问题:

Kristina 有两个数组 a 和 b,每个数组包含 n 个非负整数。 她可以对数组执行任意次数的以下操作:

对数组的每个非零元素应用减量,即用值 ai-1 (1≤i≤n) 替换每个元素 ai 的值,使得 ai>0。 如果 ai 为 0,则其值不变。 确定 Kristina 是否可以通过一些操作(可能为零)从数组 a 中获取数组 b。 换句话说,对于每个 1≤i≤n,她可以在一些操作之后使 ai=bi 吗?

例如,设 n=4,a=[3,5,4,1] 和 b=[1,3,2,0]。 在这种情况下,她可以应用两次操作:

在第一次应用操作后,她得到 a=[2,4,3,0]; 在第二次使用该操作后,她得到 a=[1,3,2,0]。 因此,在两次操作中,她可以从数组 a 中得到数组 b。

输入 输入的第一行包含一个整数 t (1≤t≤104) — 测试中的测试用例数。

测试用例的描述如下。

每个测试用例的第一行包含一个整数 n (1≤n≤5⋅104)。

每个测试用例的第二行正好包含 n 个非负整数 a1,a2,…,an (0≤ai≤109)。

每个测试用例的第三行正好包含 n 个非负整数 b1,b2,…,bn (0≤bi≤109)。

保证测试中所有测试用例的n个值之和不超过2⋅105。

输出对于每个测试用例,在单独的行上输出:

是的,如果通过执行一些操作可以从数组 a 中获取数组 b; 否,否则。 您可以在任何情况下输出 YES 和 NO(例如,字符串 yEs、yes、Yes 和 YES 将被识别为肯定响应)。

这是我的解决方案

#include<stdio.h>
#include<stdlib.h>

void array_decrement(int arr[],int length)   
{
    for(int i=0;i<length;i++)
    {       
        if(arr[i]>0)
        {
            arr[i]--;       //decrements all element by one, if element is 0 then it won't be changed
        }
    }
}

int array_cmp(int arr1[],int arr2[],int length)
{
    for(int i=0;i<length;i++)
    {
        if(arr1[i]<arr2[i])     //if any element will less than element of 2nd array, then it will return -1 
        {
            return -1;
        }
        if(arr1[i]>arr2[i])     //if any element will more than element of 2nd array, then it will return 0
        {
            return 0;
        }
    }
    return 1;                   // if all elements are same then it will return 1
}

int main()
{
    int t,n,cmp;
    scanf("%d",&t);
    for(int i=0;i<t;i++)  // t = number of testcases
    {
        scanf("%d",&n);
        int arr1[n]; 
        int arr2[n];

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


        // logical part
        while (i>=0)     //loop runs for infinite times, but it has a set of conditions which will break loop in finite time
        {
            if(array_cmp(arr1,arr2,n)==1)          // if all elements are same print "YES"
            {
                printf("YES\n");
                break;

            }else if(array_cmp(arr1,arr2,n)==0)    //if any element can be decremented then it will decrement
            {
                array_decrement(arr1,n);

            }else if(array_cmp(arr1,arr2,n)==-1)    // if any element gets to less than 2nd elemnet during process of decrement then print "NO"
            {
                printf("NO\n");
                break;
            }
        }     
    }
    return 0;
}

我的问题:当我提交此代码时,它显示“超出时间限制”,有人可以帮我解决这个错误吗?实际上我第一次遇到这个错误。

我最近在 codeforces.com 上练习...当我提交此代码时,它显示“超出时间限制”。

正如稻谷所说

这些类型的编码挑战旨在测试算法的时间复杂度。 当您超出运行时限制时,通常是因为您的算法不是解决问题的最佳方法

您的算法在一个循环中两次比较数组,该循环实际上执行所有可能的递减。

给定N ,每个数组中的元素数(显然最多 5*10 4 )和K ,将一个数组转换为另一个数组所需的可能步骤数(注意 0 <= a[i], b[ i] <= 10 9 ),posted算法的时间复杂度为O( N * K )。


考虑以下几点:

  • 如果存在非负值k (递减的数量),则数组a可以转换为b (应用问题陈述的规则),对于每个i

    • 如果b[i] == 0 ,则k >= a[i]
    • 否则:
      • 如果b[i] <= a[i] ,则k == a[i] - b[i]
      • 否则, k不存在,无法进行转换。
  • 我们不需要实际执行转换,我们只需要比较两个数组的元素(在某些情况下甚至不是全部)来找出是否存在这样的k值。 换句话说,该算法的时间复杂度为 O( N )。

当您提交解决方案时,codeforces 会在其上执行大量测试用例。 该错误表明它需要太多时间,因此您的解决方案对于运行时不是最佳的。

先看代码后我可以给个建议,动态分配太贵了,你必须尝试预分配。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM