簡體   English   中英

使用兩個嵌套的while循環時如何降低時間復雜度?

[英]How do i reduce time complexity when using two nested while loops?

第一個輸入將是測試用例的數量t ,然后給定兩個數字ab你必須執行i操作,這樣,

  • 如果i是奇數,則a加 1
  • 如果i是偶數,則將 2 添加到a

現在如果a可以等於b ,則打印 YES,如果不能,則打印 NO

當我嘗試提交我的解決方案時, i收到超過時間限制的錯誤。

#include<bits/stdc++.h>
using namespace std;

int main()
{
    int t, a, b;
    cin >> t;
    while (t)
    {
        cin >> a >> b;
        int flag = 1;
        while (a != b && a < b)
        {
            if (flag % 2 == 0)
            {
                a += 2;
            }
            else
            {
                a += 1;
            }
            flag++;
        }
        if (a == b)
            cout << "YES" << endl;
        else
            cout << "NO" << endl;
        t--;
    }
    return 0;
}

您不需要實際從a迭代到b ,只需使用以下觀察來解決:

  • 經過 2 次操作后, a的值增加了3 因此,經過偶數次操作(讓數字為2k ), a增加了3k
  • 類似地,對於奇數個操作(形式為2k+1 ), a增加3k+1

如您所見, a可以增加3k3k+1 ,這意味着b可以從a if (ba) mod 3 = (0 or 1)到達(顯然,如果b>a )。 您可以在O(1)復雜度中檢查這一點。

內部循環可以簡化為數學表達式。 我們可以通過一些例子來建立模型。

例如,如果 a = 10,則 b = 20。

Loop 1 a += 1 (11)
Loop 2 a += 2 (13)
Loop 3 a += 1 (14)
Loop 4 a += 2 (16)
...

我們可以看到,經過兩次操作后,a 增加了 3。可以概括為,經過 2n 次操作(表示偶數)后,a 增加了 3n。 另一方面,在 2n + 1 運算(奇數)之后,a 等於增加 3n + 1。因此,a 可以增加 3n 或 3n+1。 因此,3n 或 3n+1 必須能夠等於 a 和 b 的差,在本例中為 10。

因此,要么

1. 3 has to divide b - a, (b-a)%3 = 0 
2. 3 has to divide b - a with a remainder of 1, (b-a)%3=1

因此,使用數學表達式代替循環可以簡單地將每個輸入的運行時間降低到 O(1)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM