題目涉及演算法:
這道題目可以用動態規劃進行求解。
我們令 \(f[i]\) 表示自然數為 \(i\) 能夠生成的數的個數,則:
\(f[i] = 1 + \sum_^ f[j]\)
實現**如下:
#include using namespace std;
const int maxn = 1010;
int n, f[maxn];
int main()
cout << f[n] << endl;
return 0;
}
這道題目雖然名為「最大公約數和最小公倍數問題」,但其實是一道質因數分解的問題。
首先,如果p不能整除q,那麼答案肯定為 \(0\) ,直接輸出 \(0\) 即可。
其次,我們令 \(n = q/p\) ,然後對 \(n\) 進行質因數分解,假設對 \(n\) 進行質因數分解的表示式為:
\(n = a_1^ \times a_2^ \times \dots \times a_m^\)
那麼我們知道,對於其中的任意乙個 \(a_i\) ,它要麼歸到 \(x0\) ,要麼歸到 \(y0\) ,不可能有 \(1\) 個 \(a_i\) 歸到 \(x0\) ,而另乙個 \(a_i\) 歸到 \(y0\) (因為這個時候他們的最大公約數就變成了 \(x0 \times a_i\)) ,所以對於這 \(m\) 個 \(a_i\) ,他們要麼都歸到 \(x0\) ,要麼都歸到 \(y0\) ,所以總的方案數就是 \(2^m\) 。
實現**如下(**中我用 \(cnt\) 來表示不同的質因數個數):
#include using namespace std;
int n, m, p, q, cnt;
long long ans = 1;
int main()
n = q / p;
m = sqrt(n);
for (int i = 2; i <= m; i ++)
}if (n > 1) cnt ++;
cout << ( 1ll << cnt ) << endl;
return 0;
}
這道題目可以用「遞迴」進行求解。
首先,後續序列的最後乙個元素肯定是當前子樹的根節點。
我們可以在中序序列裡面找到根節點的位置,然後中序序列例根節點左邊的子串對應該根節點的左子樹,右邊的子串對應根節點的右子樹。我們遞迴地進行遍歷就可以還原出這棵樹。
同時,我們在遞迴的時候其實也可以直接輸出這棵樹的先序遍歷結果。
實現**如下:
#include using namespace std;
char zx[10], hx[10]; // zx:中序序列;hx:後序序列
// [l1,r1]對應中序序列的區間範圍;
// [l2,r2]對應後序序列的區間範圍
void dfs(int l1, int r1, int l2, int r2)
int i;
for (i = l1; i <= r1 && zx[i] != hx[r2]; i ++);
putchar(zx[i]);
int l_len = i - l1, r_len = r1 - i;
dfs(l1, i-1, l2, l2+l_len-1);
dfs(i+1, r1, r2-r_len, r2-1);
}int main()
這道題目是一道純0-1揹包問題。
對於第i件物品,我們令它的體積等於價值,套0-1揹包模板能夠得到能裝進箱子的最大價值。以箱子總體積減去總價值就是箱子的最小的剩餘空間。
實現**如下:
#include using namespace std;
const int maxn = 20020;
int n, v, c, f[maxn];
int main()
cout << v - f[v] << endl;
return 0;
}
NOIP普及組複賽題集
題目描述 牛倌被通知,他的乙隻牛逃逸了!所以他決定,馬上出發,盡快把那只牛抓回來 他們都站在數軸上 牛倌在n 0 n 100000 處,牛在k 0 k 100000 處 約翰有兩種辦法移動,步行和瞬移 步行每秒種可以讓約翰從x處走到x l或x l處 而瞬移則可讓他在1秒內從x處消失,在2x處出現 然...
2023年NOIP普及組複賽題解
題目涉及演算法 入門題,直接開乙個迴圈遍歷一下就可以了。實現 如下 include using namespace std int n,ans 0 int main cout ans endl return 0 基礎題,直接遍歷一下地圖 對於每個格仔,統計一下周圍8個格仔 就可以實現地雷的統計。實現...
2023年NOIP普及組複賽題解
題目涉及演算法 這道題目是一道基礎的模擬題,只需要模擬將數字進行翻轉就可以了,注意 0 和 負數。實現 如下 include using namespace std void solve int num if num 0 int t 0 while num 0 cout t endl int n i...