2023年NOIP普及組複賽題解

2022-05-24 08:36:11 字數 1825 閱讀 3211

題目涉及演算法:

這道題目就是一道簡單的結構體排序。

實現**如下:

#include using namespace std;

const int maxn = 330;

struct student a[maxn];

int n;

bool cmp(student a, student b)

int main()

sort(a, a+n, cmp);

for (int i = 0; i < 5; i ++)

cout << a[i].id << " " << a[i].x+a[i].y+a[i].z << endl;

return 0;

}

本體涉及演算法:貪心。

我們從小到大遍歷每個元素(將這個元素作為較小的元素),找到最大的那個與其相加的不超過w的那件物品湊成一對;剩下的就單獨作為一件。使用雙指標法實現。

實現**如下:

#include using namespace std;

const int maxn = 30030;

int w, n, a[maxn], cnt;

int main()

else

}if (i == j) cnt ++;

cout << cnt << endl;

return 0;

}

本題主要涉及演算法:動態規劃。

我們需要知道的是:一開始如果給我的魔法值 \(\ge 10\) ,那麼無論如何我都會優先選擇使用魔法。

所以一開始就是迴圈使用貪心直到我的剩餘魔法值 \(\lt 10\) 為止。

那麼在這種情況下,我只有三種策略走下一步:

所以,如果我設 \(f[i][j]\) 表示當前在第i秒結束時,我剩餘的魔法值有j點的情況下,我行走的最大距離。則, \(f[i][j]\) 應該是如下三者的最大值:

實現**如下:

#include using namespace std;

const int maxn = 300030;

int m, s, t, f[maxn][14];

int main()

}if (id > t)

f[id][m] = s;

for (int i = id+1; i <= t; i ++) }}

puts("no");

s = 0;

for (int i = 0; i <= 13; i ++) s = max(s, f[t][i]);

cout << s << endl;

return 0;

}

這道題目相信做過遞迴經典問題——漢諾塔問題——的同學應該都能夠直接推導出遞推公式。

hanoi它問題的遞推公式是:\(f[i] = 2 \times f[i-1] + 1\) ;

而我們這裡也能夠很輕鬆推導出雙塔問題的地推公式就是:

\(f[i] = 2 \times f[i-1] + 2\)

但是因為資料量比較大,所以需要使用高精度。

實現**如下:

#include using namespace std;

const int maxn = 100010;

int a[maxn], b[maxn], c[maxn], n, t;

void init()

void solve()

if (a[n]) n ++;

}int main()

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...