[英]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.