算法優化入門:AOJ1830:把正整數n寫成連續的正整數之和
題目描述
問題描述:給定n,n寫成連續的正整數之和,求所有的方案
樣例輸入 15
樣例輸出
1 5
4 6
7 8
樣例解釋
15=1+2+…+5
15=4+5+6
15=7+8
暴力枚舉法
#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
cin >> n;
for (int i = 1; i <= n; i++)
for (int j = i + 1; j <= n; j++) {
int s = 0;
for (int k = i; k <= j; k++)
s += k;
if (s == n)
cout << i << " " << j << endl;
}
return 0;
}
/**************************************************************
Problem: 1830
User: acm
Language: C++
Result: 時間超限
****************************************************************/
改進的枚舉法:
考慮到爲等差數列其和;
#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
cin >> n;
for (int i = 1; i <= n; i++)
for (int j = i + 1; j <= n; j++) {
int s = (j - i + 1) * (i + j) / 2;
if (s == n)
cout << i << " " << j << endl;
}
return 0;
}
/**************************************************************
Problem: 1830
User: acm
Language: C++
Result: 時間超限
Time:21 ms
Memory:2020 kb
****************************************************************/
部分和:
構造前綴和:則;
又因爲S數組單調 增加,我們可以對於每一個,二分查找所在的位置,如果在就有所求答案就是
#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
cin >> n;
vector<int> S(n + 1, 0);
for (int i = 1; i <= n; i++)
S[i] = S[i - 1] + i;
for (int k = 0; k <= n; k++) {
int x = S[k] + n;
int j = lower_bound(S.begin(), S.end(), x) - S.begin(); // O(logN)
if (S[j] == x && j > k + 1)
cout << k + 1 << " " << j << endl;
}
return 0;
}
/**************************************************************
Problem: 1830
User: acm
Language: C++
Result: 正確
Time:0 ms
Memory:2024 kb
****************************************************************/
數論、因子分解、解方程:
再次考慮方程,只要枚舉的每一個因子和對應的因子則通過方程組 和可以求出
#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
cin >> n;
int m = 2 * n;
for (int p = sqrt(m); p >= 1; p--) {
if (m % p != 0)
continue;
int q = m / p;
int i = (q - p + 1) / 2;
int j = (p + q - 1) / 2;
if (j > i && j - i + 1 == p && i + j == q)
cout << i << " " << j << endl;
}
return 0;
}
/**************************************************************
Problem: 1830
User: acm
Language: C++
Result: 正確
Time:21 ms
Memory:2020 kb
****************************************************************/
總結:
一個問題可以不停被優化真是非常有趣~~