簡體   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