有n
個整數從左到右排成一行,如果某個數等於它前面的2
個數的和,就稱這個數是可以表示的數。問給定的數列裡有多少個數是可以表示的數。
第一行1
個整數n
,表示數列有多少個整數。1<=n<=10000
。
第二行n
個正整數,每個正整數不超過10000
。
乙個整數,有多少可表示的數。
637.可表示的數
本題讓我們輸入乙個陣列,遍歷陣列,在0
到i - 1
的範圍裡查詢2
個數,與a[i]
相等
錯誤思路❌
用三迴圈,依次遍歷陣列,如果在0
到i - 1
的範圍內有符合條件的數時,答案+1
但是本題n的範圍是10000
,極端情況要計算1666 1667 0000
次,評測系統一秒內只能計算1 0000 0000
次,所以會超時。
正確思路✔
可以定義乙個bool
陣列,來存前面出現過某兩個數的和。
const int n2 = 1000010;
bool sum[n2];
然後遍歷陣列,在迴圈中,把a[i]
和0
到i - 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 最新的版本...