【c++算法刷题笔记】——洛谷2
1. 洛谷練習(xí)——P1579 哥德巴赫猜想(升級版)
題目描述:
現(xiàn)在請你編一個(gè)程序驗(yàn)證哥德巴赫猜想。
先給出一個(gè)奇數(shù)n,要求輸出3個(gè)質(zhì)數(shù),這3個(gè)質(zhì)數(shù)之和等于輸入的奇數(shù)。
輸入格式:
僅有一行,包含一個(gè)正奇數(shù)n,其中9<n<20000
輸出格式:
僅有一行,輸出3個(gè)質(zhì)數(shù),這3個(gè)質(zhì)數(shù)之和等于輸入的奇數(shù)。相鄰兩個(gè)質(zhì)數(shù)之間用一個(gè)空格隔開,最后一個(gè)質(zhì)數(shù)后面沒有空格。如果表示方法不唯一,請輸出第一個(gè)質(zhì)數(shù)最小的方案,如果第一個(gè)質(zhì)數(shù)最小的方案不唯一,請輸出第一個(gè)質(zhì)數(shù)最小的同時(shí),第二個(gè)質(zhì)數(shù)最小的方案。
分析過程:
如果一個(gè)奇數(shù)能分為三個(gè)數(shù)和,則只有兩種情況①偶數(shù)+偶數(shù)+奇數(shù) ②奇數(shù)+奇數(shù)+奇數(shù)。如果在加上三個(gè)數(shù)必須是質(zhì)數(shù)這個(gè)條件則①2+2+n?42 +2+n-42+2+n?4(偶質(zhì)數(shù)只有222,如果n?4n-4n?4為質(zhì)數(shù)則成立)②質(zhì)數(shù)+質(zhì)數(shù)+質(zhì)數(shù)(這三個(gè)數(shù)為大于等于3的奇數(shù))
代碼:
總結(jié):
這是看洛谷一個(gè)牛犇的想法,為什么可以這么做?題目中很明顯只讓輸出一組解,所以只需要在iii和jjj都是質(zhì)數(shù)的前提下判斷n?j?in-j-in?j?i這個(gè)數(shù)是不是質(zhì)數(shù),如果是就輸出!而且對于分析過程將題目簡化值得學(xué)習(xí)
2. 關(guān)于取模運(yùn)算的優(yōu)化技巧——P1226 【模板】快速冪||取余運(yùn)算
(A1+A2+A3+?+An)modX=(A1modX+A2modX+A3modX+?+AnmodX)modX(A_1+A_2+A_3+\cdots+A_n)modX=(A_1modX+A_2modX+A_3modX+\cdots+A_nmodX)modX(A1?+A2?+A3?+?+An?)modX=(A1?modX+A2?modX+A3?modX+?+An?modX)modX
(A1×A2×A3×?×An)modX=(A1modX×A2modX×A3modX×?×AnmodX)modX(A_1×A_2×A_3×\cdots×A_n)modX=(A_1modX×A_2modX×A_3modX×\cdots×A_nmodX)modX(A1?×A2?×A3?×?×An?)modX=(A1?modX×A2?modX×A3?modX×?×An?modX)modX
3.洛谷練習(xí)——P1032 字串變換.
題目描述:
已知有兩個(gè)字串AAA,BBB及一組字串變換的規(guī)則(至多666個(gè)規(guī)則):
A1?>B1A_1->B_1A1??>B1?
A2?>B2A_2->B_2A2??>B2?
規(guī)則的含義為:在AAA中的子串A1A_1A1?可以變換成B1B_1B1?,A2A_2A2?可以變換成B2B_2B2?
輸入格式:
AAA BBB
A1A_1A1? B1B_1B1?
A2A_2A2? B2B_2B2?
...............
所有字符串長度的上限為202020。
輸出格式:
若在101010步(包含101010步)以內(nèi)能將AAA變換為BBB,則輸出最少的變換步數(shù);否則輸出"NO ANSWER!"
分析過程:
這里明顯是個(gè)寬搜題BFS,如果拿到手里不知道怎么運(yùn)用寬搜(字符串)。這題的難點(diǎn):①字符串寬搜如何更新。②優(yōu)化!用到map<string,int>map<string,int>map<string,int>
代碼:
總結(jié):
本題是我參考b站一個(gè)up主的解答。用mapmapmap這個(gè)函數(shù)作為原來的visitvisitvisit記錄已經(jīng)遍歷過的點(diǎn)優(yōu)化BFS,而且學(xué)到了字符串的拼接更新。
4.洛谷練習(xí)——P1012 拼數(shù)
題目描述:
設(shè)有nnn個(gè)正整數(shù)(n≤20)(n≤20)(n≤20),將它們聯(lián)接成一排,組成一個(gè)最大的多位整數(shù)。
例如:n=3n=3n=3時(shí),333個(gè)整數(shù)13,312,34313,312,34313,312,343聯(lián)接成的最大整數(shù)為:343312133433121334331213
又如:n=4n=4n=4時(shí),444個(gè)整數(shù)7,13,4,2467,13,4,2467,13,4,246聯(lián)接成的最大整數(shù)為:742461374246137424613
輸入格式:
第一行,一個(gè)正整數(shù)nnn。
第二行,nnn個(gè)正整數(shù)。
輸出格式:
一個(gè)正整數(shù),表示最大的整數(shù)。
分析過程:
剛拿到這個(gè)題的時(shí)候,感覺簡單啊,不就是個(gè)字符串比較,最大的放最前面如果是000不輸出就ok了?其實(shí)這題遠(yuǎn)遠(yuǎn)沒有那么容易如果不是測試點(diǎn)我可能跟不想不到哪里出了問題。比如a=32,b=321a=32,b=321a=32,b=321明顯32321>3213232321>3213232321>32132但是如果你按字符串的比較方法得到的結(jié)果確實(shí)后者所以我們不是比較字符串aaa和bbb的大小,而是比較字符串a+ba+ba+b和b+ab+ab+a的大小!
代碼:
總結(jié):
這一題我自己先用字符串比較硬湊條件懟出來了,我看了別的神犇的方法恍然大悟,柳暗花明。為什么我想不到呢?可能見得多了就知道了!所以記錄下來方便復(fù)習(xí)
5.洛谷練習(xí)——P1538 迎春舞會(huì)之?dāng)?shù)字舞蹈
此代碼來自b站up主——嘉持
#include<iostream> #include<string> #include<algorithm> using namespace std; int n, h, w; string a; string c[5] = { " - - - - - - - - ", "| | | | | | | | | | | | | | ", " - - - - - - - ", "| | | | | | | | | | | | | ", " - - - - - - - ", }; char f(int x, int y) {if (x >= 1)x = max(x - n + 1, 1);if (x >= 3)x = max(x - n + 1, 3);int m = y / (n + 3);y %= (n+3);if (y > 0)y = max(y - n + 1, 1);return c[x][y + (a[m] - '0')* 4]; } int main() {cin >> n>> a;h = 2 * n + 3;w = (n + 3) * (a.length());for (int i = 0; i < h; i++){for (int j = 0; j < w; j++)cout << f(i, j);cout << endl;}return 0; }總結(jié):
這題把我心態(tài)搞崩了,啥也不想寫,看上方老師的視頻講解吧。
2020/3/1第二次刷洛谷,前幾天學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)算法的知識(shí)比如dfs,bfs,然后又刷了幾十道題不過現(xiàn)在有刷不懂了又開始看算法hhh
總結(jié)
以上是生活随笔為你收集整理的【c++算法刷题笔记】——洛谷2的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何写出一篇受编辑喜欢的人物稿如何写好人
- 下一篇: C++ __gnu_pbds(hash,