2023年NOIP普及組複賽題解

2022-05-24 08:42:07 字數 2092 閱讀 4052

題目涉及演算法:

這道題目可以用動態規劃進行求解。

我們令 \(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...