日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

【c++算法刷题笔记】——洛谷2

發(fā)布時(shí)間:2023/12/3 c/c++ 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【c++算法刷题笔记】——洛谷2 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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ù))
代碼:

#include<iostream> #include<cmath> using namespace std; bool isPrime_3(int num); int main() {int n;cin >> n;if (isPrime_3(n - 4))//如果滿足第一種情況直接輸出返回{cout << 2 << " " << 2 << " " << n - 4 << endl;return 0;}elsefor (int i = 3; i < n; i += 2){if (isPrime_3(i)) //i必須是質(zhì)數(shù){for (int j = i; i < n; j += 2)//這里先判斷n-j-i是不是奇數(shù)(因?yàn)榕袛嗥鏀?shù)比較快) 另一種判斷奇數(shù)(n-j-i)&1if ((n - j - i) % 2 == 1&& isPrime_3(j) && isPrime_3(n - j - i)){cout << i << " " << j << " " << n - j - i << endl;return 0;}}} } bool isPrime_3(int num)//優(yōu)化后的判斷質(zhì)數(shù) 第一次洛谷刷題學(xué)到的(詳細(xì)看【c++算法刷題筆記】——洛谷<1>) {if (num == 2 || num == 3)return 1;if (num % 6 != 1 && num % 6 != 5)return 0;int tmp = sqrt(num);for (int i = 5; i <= tmp; i += 6)if (num % i == 0 || num % (i + 2) == 0)return 0;return 1; }

總結(jié):
這是看洛谷一個(gè)牛犇的想法,為什么可以這么做?題目中很明顯只讓輸出一組解,所以只需要在iiijjj都是質(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è)字串AAABBB及一組字串變換的規(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>
代碼:

#include<iostream> #include<queue> #include<map> #include<string> using namespace std; int main() {map<string, int>mp;string a, b;cin >> a >> b;string x[7], y[7];int n = 0;while (cin >> x[n] >> y[n])n++;queue<string>Q;queue<int>s;Q.push(a);//記錄字符串s.push(0);//記錄布數(shù)while (!Q.empty()){if (Q.front() == b)//如果得到結(jié)果直接返回{cout << s.front() << endl;return 0;}if (s.front() == 10){cout << "NO ANSWER!" << endl;return 0;}string t = Q.front();if (mp.count(t)){Q.pop();s.pop();continue;}mp[t] = 1;//將字符串映射到mp中的一個(gè)位置for (int i = 0; i < n; i++){int p = 0;while (t.find(x[i], p) != -1)//查找成功返回位置否則返回-1{p = t.find(x[i], p);//在t字符串中從p這個(gè)位置開始查找x[i]字符串Q.push(t.substr(0, p) + y[i] + t.substr(p + x[i].length()));//字符串替換,substr(0,p)將字符串中0-p的字符取出來s.push(s.front() + 1);p++;}}Q.pop();s.pop();}cout << "NO ANSWER!" << endl;return 0; }

總結(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)(n20),將它們聯(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=32b=321明顯32321>3213232321>3213232321>32132但是如果你按字符串的比較方法得到的結(jié)果確實(shí)后者所以我們不是比較字符串aaabbb的大小,而是比較字符串a+ba+ba+bb+ab+ab+a的大小!
代碼:

#include<iostream> #include<cstring> using namespace std; int main() {string arr[21];int n;cin >> n;for (int i = 1; i <= n; i++)cin >> arr[i];for (int i = 1; i <= n - 1; i++){for (int j = 1; j <= n - i; j++){if ((arr[j]+arr[j+1])<(arr[j+1]+arr[j])){string p = arr[j];arr[j] = arr[j + 1];arr[j + 1] = p;}}}if (arr[1] == "0")//注意:如果為0最終結(jié)果只需要輸出一個(gè)0cout << 0 << endl;else{for (int i = 1; i <= n; i++)cout << arr[i];}return 0; }

總結(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。