51goc 637 可表示的數 題解

2022-10-08 22:48:26 字數 1959 閱讀 8327

n個整數從左到右排成一行,如果某個數等於它前面的2個數的和,就稱這個數是可以表示的數。問給定的數列裡有多少個數是可以表示的數。

第一行1個整數n,表示數列有多少個整數。1<=n<=10000

第二行n個正整數,每個正整數不超過10000

乙個整數,有多少可表示的數。

637.可表示的數

本題讓我們輸入乙個陣列,遍歷陣列,在0i - 1的範圍裡查詢2個數,與a[i]相等

錯誤思路❌

用三迴圈,依次遍歷陣列,如果在0i - 1的範圍內有符合條件的數時,答案+1

但是本題n的範圍是10000,極端情況要計算1666 1667 0000次,評測系統一秒內只能計算1 0000 0000次,所以會超時。

正確思路✔

可以定義乙個bool陣列,來存前面出現過某兩個數的和。

const int n2 = 1000010;

bool sum[n2];

然後遍歷陣列,在迴圈中,把a[i]0i - 1的數分別計算加和,把sum[a[i] + a[j]]標記為true

再判斷sum[a[i]]是否為true即可.

注意:判斷應在第二重迴圈前,因為是在a[i]之前找數。

long long res = 0;

for (int i = 1; i < n; i ++ )

正確**最多計算49995000次,評測系統一秒內能計算1 0000 0000次,所以不會超時。

做題時,使用for迴圈,要考慮時間複雜度

錯誤思路❌ **

#include using namespace std;

const int n = 10010;

int a[n]; // 定義陣列

int main()} }

cout << res << endl; // 輸出答案

return 0;

}

正確思路✔ **
#include using namespace std;

const int n1 = 10010;

int a[n1]; // 定義輸入的陣列

const int n2 = 1000010;

bool sum[n2]; // 定義存和的陣列

int main()

cout << res << endl; // 輸出答案

return 0;

}

複雜度

數量級最大規模

o(logn)

>> 10 ^ 20

很大o(n^1 / 2)

10 ^ 12

10 ^ 14

o(n)

10 ^ 6

10 ^ 7

o(nlogn)

10 ^ 5

10 ^ 6

o(n ^ 2)

1000

2500

o(n ^ 3)

100500

o(n ^ 4)

5050

o(2 ^ n)

2020

o(3 ^ n)

1415

o(n!)910

51nod 6級題目 XOR key 問題

這題挺有意思的,就是給你乙個數和一段區間,求區間內的乙個數與這個數xor起來的最大值,輸出之。很自然的想到trie樹來做,然後用線段樹套起來,發現效率o q lg n lg 10 9 很不錯嘛,於是做之,寫了trie的合併,判漏了當主樹存在副樹不存在的合併情況,調之 寫個巨集定義導致max內多次呼叫...

CentOS6 x公升級MySQL版本5 1到5 6

有一些虛擬機器 雲主機提供商仍然使用的是老版本的安裝套件。預裝的應用軟體版本很低。比如 techbrood.com 使用的雲伺服器,其中mysql預裝版本為老版本5.1.x。而最新的mysql版本在效能 功能 安全性等方面都有了很多的改進。要從最新版本獲益,你需要把現有系統公升級到5.5 最新的版本...

CentOS6 x公升級MySQL版本5 1到5 6

有一些虛擬機器 雲主機提供商仍然使用的是老版本的安裝套件。預裝的應用軟體版本很低。比如 techbrood.com 使用的雲伺服器,其中mysql預裝版本為老版本5.1.x。而最新的mysql版本在效能 功能 安全性等方面都有了很多的改進。要從最新版本獲益,你需要把現有系統公升級到5.5 最新的版本...