2023年第八屆 藍橋杯C組 C C 決賽題解

2022-09-10 21:42:18 字數 4651 閱讀 5664

藍橋杯歷年國賽真題彙總:here

哥德**猜想認為:不小於4的偶數都可以表示為兩個素數的和。

你不需要去證明這個定理,但可以通過計算機對有限數量的偶數進行分解,驗證是否可行。

實際上,一般乙個偶數會有多種不同的分解方案,我們關心包含較小素數的那個方案。

對於給定數值範圍,我們想知道這些包含較小素數方案中最大的素數是多少。

比如,100以內,這個數是19,它由98的分解貢獻。

你需要求的是10000以內,這個數是多少?

答案:173

const int n = 10000;

vectorprime;

bool vis[10010];

int ans;

void check(int n)

}}void solve()

w星球的長老交給小明乙個任務:

1,2,3...16 這16個數字分為兩組。

要求:這兩組數字的和相同,

並且,兩組數字的平方和也相同,

並且,兩組數字的立方和也相同。

請你利用計算機的強大搜尋能力解決這個問題。

並提交1所在的那個分組的所有數字。

這些數字要從小到大排列,兩個數字間用乙個空格分開。

即類似:1 4 5 8 ... 這樣的答案。

注意,只提交這一組數字,不要填寫任何多餘的內容。

笨笨有話說:

只要乙個組的成員確定了,另乙個組的成員也就確定了。列舉乙個組的成員就可以了。

憑直覺,兩個組的成員數目不會差太多吧。

歪歪有話說:

既然求 1 所在的那個組,那只要列舉剩餘的成員就可以了。

貌似都是8個成員的可能性很大啊。

答案:1 4 6 7 10 11 13 16

爆搜

bool vis[17];

void dfs(int pos, int cnt)

if (sum1 == sum11 and sum2 == sum22)

return ;

}for (int i = pos + 1; i <= 16; ++i)

}

雖然我們學了許久的程式設計,但對於簡單的四則混合表示式,如果讓我們完全白手起家地程式設計來解析,還是有點棘手。

這裡,我們簡化一下問題,假設只有加法和乘法,並且沒有括號來改變優先順序。

再假設參加運算的都是正整數。

在這麼多的限制條件下,表示式的解析似乎簡單了許多。

下面的**解決了這個問題。請仔細閱讀原始碼,並填寫劃線部分缺少的**。

#include int f3(const char* s, int begin, int end) 

return sum;

}int f2(const char* s, int begin, int end)

printf("f2: pro=%d\n", pro);

return pro;

}int f(const char* s)

return sum;

}int main()

注意:只填寫劃線處缺少的內容,不要填寫已有的**或符號,也不要填寫任何解釋說明文字等。

答案:f3(s, p0, p)仔細閱讀**即可

我們知道,整數做除法時,有時得到有限小數,有時得到無限迴圈小數。

如果我們把有限小數的末尾加上無限多個0,它們就有了統一的形式。

本題的任務是:在上面的約定下,求整數除法小數點後的第n位開始的3位數。

輸入:一行三個整數:a b n,用空格分開。a是被除數,b是除數,n是所求的小數後位置(0比如:

輸入:

1 8 1
程式應該輸出:

125
再比如:

輸入:

1 8 3
程式應該輸出:

500
再比如:

輸入:

282866 999000 6
程式應該輸出:

914
提交時,注意選擇所期望的編譯器型別。

笨笨有話說:

這個除法小學就會算啊,模擬手算除法的過程就可以了吧。

只是數有點大啊....

管它呢,能算多遠算多遠....

歪歪有話說:

如果我能確定迴圈節從**開始到**結束,再大的數不過就是與它取模的餘數等價啊

【思路】

模擬除法。

13 / 7 = 1.85714285...

這裡求小數部分,所有取模忽略掉整數部分

13 / 7 -> 6 / 7

第一位:(小數點後第幾位,以下同)6 * 10 / 7 = 8;

得到第一位後的餘數:6 * 10 % 7 = 4

那麼第二位:4 * 10 / 7 = 5

得到第二位後的餘數:4 * 10 % 7 = 5

第三位:5 * 10 / 7 = 7

依此類推

void solve() 

for (int i = 0; i < n + 2; ++i)

}

n個人參加某項特殊考試。

為了公平,要求任何兩個認識的人不能分在同乙個考場。

求最少需要分幾個考場才能滿足條件。

輸入格式:

第一行,乙個整數n(1輸出格式:

一行乙個整數,表示最少分幾個考場。

例如:輸入:

5

81 2

1 31 4

2 32 4

2 53 4

4 5

程式應該輸出:

4
再比如:

輸入:

5

101 2

1 31 4

1 52 3

2 42 5

3 43 5

4 5

則程式應該輸出:

5
資源約定:

峰值記憶體消耗 < 256m

cpu消耗 < 1000ms

【思路】

一開始以為是並查集之類的連通圖大小的問題,寫了一發結果只通過 30% 的資料,重新審題發現其實就是圖的著色問題:給定頂點數和邊,求至少需要多少種顏色對圖進行塗色能是相鄰頂點顏色不同。

const int n = 110, inf = 0x3f3f3f3f;

int e[n][n];

int vis[n][n]; // vis[i][j] = t表示第i個考場裡面第j個人是t

int cnt[n]; // 記錄每個考場種的學生數量(對應的vis)

int ans = inf, n, m;

void dfs(int id, int num)

for (int i = 1; i <= num; ++i)

} // 現有考場都不行,就要增加考場

vis[num + 1][++cnt[num + 1]] = id;

dfs(id + 1, num + 1);

--cnt[num + 1]; // 回溯

}void solve()

dfs(1, 0);

cout << ans << "\n";

}

w星球的乙個種植園,被分成 m * n 個小格仔(東西方向m行,南北方向n列)。每個格仔裡種了一株合根植物。

這種植物有個特點,它的根可能會沿著南北或東西方向伸展,從而與另乙個格仔的植物合成為一體。

如果我們告訴你哪些小格仔間出現了連根現象,你能說出這個園中一共有多少株合根植物嗎?

輸入格式:

第一行,兩個整數m,n,用空格分開,表示格仔的行數、列數(1格仔的編號一行一行,從上到下,從左到右編號。

比如:5 * 4 的小格仔,編號:

1  2  3  4

5 6 7 8

9 10 11 12

13 14 15 16

17 18 19 20

樣例輸入:

5 4

162 3

1 55 9

4 87 8

9 10

10 11

11 12

10 14

12 16

14 18

17 18

15 19

19 20

9 13

13 17

樣例輸出:

5
其合根情況參考圖[p1.png]

資源約定:

峰值記憶體消耗 < 256m

cpu消耗 < 2000ms

待補

2023年第八屆藍橋杯C B組D題

6x6的方格,沿著格仔的邊線剪開成兩部分。要求這兩部分的形狀完全相同。如圖所示就是可行的分割法。試計算 包括這3種分法在內,一共有多少種不同的分割方法。注意 旋轉對稱的屬於同一種分割法。請提交該整數,不要填寫任何多餘的內容或說明文字。哈嘍,我又來補題了,我發現真的 就2019特簡單吧 其餘的。300...

2023年第八屆藍橋杯C B組G題

小明正在整理一批歷史文獻。這些歷史文獻 現了很多日期。小明知道這些日期都在1960年1月1日至2059年12月31日。令小明頭疼的是,這些日期採用的格式非常不統一,有採用年 月 日的,有採用月 日 年的,還有採用日 月 年的。更加麻煩的是,年份也都省略了前兩位,使得文獻上的乙個日期,存在很多可能的日...

2023年第八屆藍橋杯C B組I題

兒童節那天有k位小朋友到小明家做客。小明拿出了珍藏的巧克力招待小朋友們。小明一共有n塊巧克力,其中第i塊是hi x wi的方格組成的長方形。為了公平起見,小明需要從這 n 塊巧克力中切出k塊巧克力分給小朋友們。切出的巧克力需要滿足 1.形狀是正方形,邊長是整數 2.大小相同例如一塊6x5的巧克力可以...