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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

第六届团队程序设计天梯赛 全题目解析讲解

發(fā)布時(shí)間:2024/1/8 编程问答 58 豆豆
生活随笔 收集整理的這篇文章主要介紹了 第六届团队程序设计天梯赛 全题目解析讲解 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

B站已經(jīng)錄好視頻合集:--------------------傳送門---------------------
題目是2021年4月天梯賽決賽原題:

題號(hào)題目名稱
L1-1人與神
L1-2兩小時(shí)學(xué)完C語(yǔ)言
L1-3強(qiáng)迫癥
L1-4降價(jià)提醒機(jī)器人
L1-5大笨鐘的心情
L1-6吉老師的回歸
L1-7天梯賽的善良
L1-8乘法口訣數(shù)列
L2-1包裝機(jī)
L2-2病毒溯源
L2-3清點(diǎn)代碼庫(kù)
L2-4哲哲打游戲
L3-1森森旅游
L3-2還原文件
L3-3可憐的簡(jiǎn)單題

AC代碼:

L1-1 人與神

跨界大神 L. Peter Deutsch 有一句名言:“To iterate is human, to recurse divine.”(迭代的是人,遞歸的是神)。本題就請(qǐng)你直接在屏幕上輸出這句話。

輸入格式:
本題沒有輸入。

輸出格式:
在一行中輸出 To iterate is human, to recurse divine.。

輸入樣例:
無(wú)
輸出樣例:
To iterate is human, to recurse divine.

#include <bits/stdc++.h> using namespace std;int main() {printf("To iterate is human, to recurse divine.");return 0; }

L1-2 兩小時(shí)學(xué)完C語(yǔ)言

知乎上有個(gè)寶寶問(wèn):“兩個(gè)小時(shí)內(nèi)如何學(xué)完 C 語(yǔ)言?”當(dāng)然,問(wèn)的是“學(xué)完”并不是“學(xué)會(huì)”。

假設(shè)一本 C 語(yǔ)言教科書有 N 個(gè)字,這個(gè)寶寶每分鐘能看 K 個(gè)字,看了 M 分鐘。還剩多少字沒有看?

輸入格式:
輸入在一行中給出 3 個(gè)正整數(shù),分別是 N(不超過(guò) 400 000),教科書的總字?jǐn)?shù);K(不超過(guò) 3 000),是寶寶每分鐘能看的字?jǐn)?shù);M(不超過(guò) 120),是寶寶看書的分鐘數(shù)。

題目保證寶寶看完的字?jǐn)?shù)不超過(guò) N。

輸出格式:
在一行中輸出寶寶還沒有看的字?jǐn)?shù)。

輸入樣例:
100000 1000 72
輸出樣例:
28000

#include <bits/stdc++.h> using namespace std;int main() {int a, b, c;cin >> a >> b >> c;cout << a - b * c << endl;return 0; }

L1-3 強(qiáng)迫癥

小強(qiáng)在統(tǒng)計(jì)一個(gè)小區(qū)里居民的出生年月,但是發(fā)現(xiàn)大家填寫的生日格式不統(tǒng)一,例如有的人寫 199808,有的人只寫 9808。有強(qiáng)迫癥的小強(qiáng)請(qǐng)你寫個(gè)程序,把所有人的出生年月都整理成 年年年年-月月 格式。對(duì)于那些只寫了年份后兩位的信息,我們默認(rèn)小于 22 都是 20 開頭的,其他都是 19 開頭的。

輸入格式:
輸入在一行中給出一個(gè)出生年月,為一個(gè) 6 位或者 4 位數(shù),題目保證是 1000 年 1 月到 2021 年 12 月之間的合法年月。

輸出格式:
在一行中按標(biāo)準(zhǔn)格式 年年年年-月月 將輸入的信息整理輸出。

輸入樣例 1:
9808
輸出樣例 1:
1998-08
輸入樣例 2:
0510
輸出樣例 2:
2005-10
輸入樣例 3:
196711
輸出樣例 3:
1967-11

#include <bits/stdc++.h> using namespace std;int main() {int n;scanf("%d", &n);if(n < 10000) {int x = n / 100;if(x < 22) cout << 20;else cout << 19;if(x < 10) cout << 0;cout << x;x = n % 100;cout << '-';if(x < 10) cout << 0;cout << x;}else {int x = n / 100;if(x < 10) cout << 0;cout << x << "-";x = n % 100;if(x < 10) cout << 0;cout << x;}return 0; }

L1-4 降價(jià)提醒機(jī)器人

小 T 想買一個(gè)玩具很久了,但價(jià)格有些高,他打算等便宜些再買。但天天盯著購(gòu)物網(wǎng)站很麻煩,請(qǐng)你幫小 T 寫一個(gè)降價(jià)提醒機(jī)器人,當(dāng)玩具的當(dāng)前價(jià)格比他設(shè)定的價(jià)格便宜時(shí)發(fā)出提醒。

輸入格式:
輸入第一行是兩個(gè)正整數(shù) N 和 M (1≤N≤100,0≤M≤1000),表示有 N 條價(jià)格記錄,小 T 設(shè)置的價(jià)格為 M。

接下來(lái) N 行,每行有一個(gè)實(shí)數(shù) Pi?(?1000.0<Pi?<1000.0),表示一條價(jià)格記錄。

輸出格式:
對(duì)每一條比設(shè)定價(jià)格 M 便宜的價(jià)格記錄 P,在一行中輸出 On Sale! P,其中 P 輸出到小數(shù)點(diǎn)后 1 位。

輸入樣例:
4 99
98.0
97.0
100.2
98.9
輸出樣例:
On Sale! 98.0
On Sale! 97.0
On Sale! 98.9

#include <bits/stdc++.h> using namespace std;int main() {int n, m;scanf("%d%d", &n, &m);for(int i = 1; i <= n; i++) {double x;scanf("%lf", &x);if(x < m) printf("On Sale! %.1lf\n", x);}return 0; }

L1-5 大笨鐘的心情

有網(wǎng)友問(wèn):未來(lái)還會(huì)有更多大笨鐘題嗎?笨鐘回復(fù)說(shuō):看心情……

本題就請(qǐng)你替大笨鐘寫一個(gè)程序,根據(jù)心情自動(dòng)輸出回答。

輸入格式:
輸入在一行中給出 24 個(gè) [0, 100] 區(qū)間內(nèi)的整數(shù),依次代表大笨鐘在一天 24 小時(shí)中,每個(gè)小時(shí)的心情指數(shù)。

隨后若干行,每行給出一個(gè) [0, 23] 之間的整數(shù),代表網(wǎng)友詢問(wèn)笨鐘這個(gè)問(wèn)題的時(shí)間點(diǎn)。當(dāng)出現(xiàn)非法的時(shí)間點(diǎn)時(shí),表示輸入結(jié)束,這個(gè)非法輸入不要處理。題目保證至少有 1 次詢問(wèn)。

輸出格式:
對(duì)每一次提問(wèn),如果當(dāng)時(shí)笨鐘的心情指數(shù)大于 50,就在一行中輸出 心情指數(shù) Yes,否則輸出 心情指數(shù) No。

輸入樣例:
80 75 60 50 20 20 20 20 55 62 66 51 42 33 47 58 67 52 41 20 35 49 50 63
17
7
3
15
-1
輸出樣例:
52 Yes
20 No
50 No
58 Yes

#include <bits/stdc++.h> using namespace std; int a[24]; int main() {for(int i = 0; i < 24; i++) scanf("%d", &a[i]);while(1) {int x;scanf("%d", &x);if(x < 0 || x > 23) break;if(a[x] > 50) printf("%d Yes\n", a[x]);else printf("%d No\n", a[x]);}return 0; }

L1-6 吉老師的回歸

曾經(jīng)在天梯賽大殺四方的吉老師決定回歸天梯賽賽場(chǎng)啦!

為了簡(jiǎn)化題目,我們不妨假設(shè)天梯賽的每道題目可以用一個(gè)不超過(guò) 500 的、只包括可打印符號(hào)的字符串描述出來(lái),如:Problem A: Print “Hello world!”。

眾所周知,吉老師的競(jìng)賽水平非常高超,你可以認(rèn)為他每道題目都會(huì)做(事實(shí)上也是……)。因此,吉老師會(huì)按照順序看題并做題。但吉老師水平太高了,所以簽到題他就懶得做了(浪費(fèi)時(shí)間),具體來(lái)說(shuō),假如題目的字符串里有 qiandao 或者 easy(區(qū)分大小寫)的話,吉老師看完題目就會(huì)跳過(guò)這道題目不做。

現(xiàn)在給定這次天梯賽總共有幾道題目以及吉老師已經(jīng)做完了幾道題目,請(qǐng)你告訴大家吉老師現(xiàn)在正在做哪個(gè)題,或者吉老師已經(jīng)把所有他打算做的題目做完了。

提醒:天梯賽有分?jǐn)?shù)升級(jí)的規(guī)則,如果不做簽到題可能導(dǎo)致團(tuán)隊(duì)總分不足以升級(jí),一般的選手請(qǐng)千萬(wàn)不要學(xué)習(xí)吉老師的酷炫行為!

輸入格式:
輸入第一行是兩個(gè)正整數(shù) N,M (1≤M≤N≤30),表示本次天梯賽有 N 道題目,吉老師現(xiàn)在做完了 M 道。

接下來(lái) N 行,每行是一個(gè)符合題目描述的字符串,表示天梯賽的題目?jī)?nèi)容。吉老師會(huì)按照給出的順序看題——第一行就是吉老師看的第一道題,第二行就是第二道,以此類推。

輸出格式:
在一行中輸出吉老師當(dāng)前正在做的題目對(duì)應(yīng)的題面(即做完了 M 道題目后,吉老師正在做哪個(gè)題)。如果吉老師已經(jīng)把所有他打算做的題目做完了,輸出一行 Wo AK le。

輸入樣例 1:
5 1
L1-1 is a qiandao problem.
L1-2 is so…easy.
L1-3 is Easy.
L1-4 is qianDao.
Wow, such L1-5, so easy.
輸出樣例 1:
L1-4 is qianDao.
輸入樣例 2:
5 4
L1-1 is a-qiandao problem.
L1-2 is so easy.
L1-3 is Easy.
L1-4 is qianDao.
Wow, such L1-5, so!!easy.
輸出樣例 2:
Wo AK le

#include <bits/stdc++.h> using namespace std; int main() {int n, m;string s;scanf("%d %d\n", &n, &m);for(int i = 1; i <= n; i++) {getline(cin, s);int len = s.size();bool flag = true; //flag為true的時(shí)候,說(shuō)明這行字符串不包含easy或qiandao for(int j = 0; j < len; j++) {if(j + 3 < len) {if(s[j] == 'e' && s[j+1] == 'a' && s[j+2] == 's' && s[j+3] == 'y') // 說(shuō)明包含easyflag = false; // pass }if(j + 6 < len) {if(s[j] == 'q' && s[j+1] == 'i' && s[j+2] == 'a' && s[j+3] == 'n' && s[j+4] == 'd' && s[j+5] == 'a' && s[j+6] =='o')flag = false; // pass }}if(flag == true) m--;if(m == -1) {cout << s << endl;return 0;}}cout << "Wo AK le" << endl;return 0; }

L1-7 天梯賽的善良

天梯賽是個(gè)善良的比賽。善良的命題組希望將題目難度控制在一個(gè)范圍內(nèi),使得每個(gè)參賽的學(xué)生都有能做出來(lái)的題目,并且最厲害的學(xué)生也要非常努力才有可能得到高分。

于是命題組首先將編程能力劃分成了 10^6個(gè)等級(jí)(太瘋狂了,這是假的),然后調(diào)查了每個(gè)參賽學(xué)生的編程能力。現(xiàn)在請(qǐng)你寫個(gè)程序找出所有參賽學(xué)生的最小和最大能力值,給命題組作為出題的參考。

輸入格式:
輸入在第一行中給出一個(gè)正整數(shù) N(≤2×10^4 ),即參賽學(xué)生的總數(shù)。隨后一行給出 N 個(gè)不超過(guò) 10^6的正整數(shù),是參賽學(xué)生的能力值。

輸出格式:
第一行輸出所有參賽學(xué)生的最小能力值,以及具有這個(gè)能力值的學(xué)生人數(shù)。第二行輸出所有參賽學(xué)生的最大能力值,以及具有這個(gè)能力值的學(xué)生人數(shù)。同行數(shù)字間以 1 個(gè)空格分隔,行首尾不得有多余空格。

輸入樣例:
10
86 75 233 888 666 75 886 888 75 666
輸出樣例:
75 3
888 2

#include <bits/stdc++.h> using namespace std; const int Maxn = 20000 + 20; int n, f[Maxn]; int main() {scanf("%d", &n);for(int i = 1; i <= n; i++) scanf("%d", &f[i]);//[1,n]sort(f + 1, f + 1 + n); //[1, n+1)int cnt1 = 0, cnt2 = 0;for(int i = 1; i <= n; i++) {if(f[i] == f[1]) cnt1++;if(f[i] == f[n]) cnt2++;}printf("%d %d\n%d %d", f[1], cnt1, f[n], cnt2); // n * logn/*int Max = f[1], Min = f[1];for(int i = 2; i <= n; i++) {if(f[i] > Max) Max = f[i];if(f[i] < Min) Min = f[i];}int cnt1 = 0, cnt2 = 0;for(int i = 1; i <= n; i++) {if(f[i] == Min) cnt1++;if(f[i] == Max) cnt2++;}printf("%d %d\n%d %d", Min, cnt1, Max, cnt2); */ // O(n)return 0; }

L1-8 乘法口訣數(shù)列

本題要求你從任意給定的兩個(gè) 1 位數(shù)字 a1?和a2開始,用乘法口訣生成一個(gè)數(shù)列 {an?},規(guī)則為從a1?開始順次進(jìn)行,每次將當(dāng)前數(shù)字與后面一個(gè)數(shù)字相乘,將結(jié)果貼在數(shù)列末尾。如果結(jié)果不是 1 位數(shù),則其每一位都應(yīng)成為數(shù)列的一項(xiàng)。

輸入格式:
輸入在一行中給出 3 個(gè)整數(shù),依次為 a1?、a2?和n,滿足 0≤a1?,a2?≤9,0<n≤10^3。

輸出格式:
在一行中輸出數(shù)列的前 n 項(xiàng)。數(shù)字間以 1 個(gè)空格分隔,行首尾不得有多余空格。

輸入樣例:
2 3 10
輸出樣例:
2 3 6 1 8 6 8 4 8 4
樣例解釋:
數(shù)列前 2 項(xiàng)為 2 和 3。從 2 開始,因?yàn)?2×3=6,所以第 3 項(xiàng)是 6。因?yàn)?3×6=18,所以第 4、5 項(xiàng)分別是 1、8。依次類推…… 最后因?yàn)榈?6 項(xiàng)有 6×8=48,對(duì)應(yīng)第 10、11 項(xiàng)應(yīng)該是 4、8。而因?yàn)橹灰筝敵銮?10 項(xiàng),所以在輸出 4 后結(jié)束。

#include <bits/stdc++.h> using namespace std; const int Maxn = 1000 + 10; int n, f[Maxn]; int main() {scanf("%d%d%d", &f[1], &f[2], &n);int cnt = 3;for(int i = 1; i <= 1000; i++) {int x = f[i] * f[i + 1];if(x < 10) {f[cnt++] = x; // cnt++;}else {f[cnt++] = x / 10; // cnt++;f[cnt++] = x % 10; //cnt++;}if(cnt > n) break;}for(int i = 1; i < n; i++)printf("%d ", f[i]);printf("%d", f[n]);return 0; }

L2-1 包裝機(jī)

一種自動(dòng)包裝機(jī)的結(jié)構(gòu)如圖 1 所示。首先機(jī)器中有 N 條軌道,放置了一些物品。軌道下面有一個(gè)筐。當(dāng)某條軌道的按鈕被按下時(shí),活塞向左推動(dòng),將軌道盡頭的一件物品推落筐中。當(dāng) 0 號(hào)按鈕被按下時(shí),機(jī)械手將抓取筐頂部的一件物品,放到流水線上。圖 2 顯示了順序按下按鈕 3、2、3、0、1、2、0 后包裝機(jī)的狀態(tài)。

圖1 自動(dòng)包裝機(jī)的結(jié)構(gòu)

圖 2 順序按下按鈕 3、2、3、0、1、2、0 后包裝機(jī)的狀態(tài)

一種特殊情況是,因?yàn)榭鸬娜萘渴怯邢薜?#xff0c;當(dāng)筐已經(jīng)滿了,但仍然有某條軌道的按鈕被按下時(shí),系統(tǒng)應(yīng)強(qiáng)制啟動(dòng) 0 號(hào)鍵,先從筐里抓出一件物品,再將對(duì)應(yīng)軌道的物品推落。此外,如果軌道已經(jīng)空了,再按對(duì)應(yīng)的按鈕不會(huì)發(fā)生任何事;同樣的,如果筐是空的,按 0 號(hào)按鈕也不會(huì)發(fā)生任何事。

現(xiàn)給定一系列按鈕操作,請(qǐng)你依次列出流水線上的物品。

輸入格式:
輸入第一行給出 3 個(gè)正整數(shù) N(≤100)、M(≤1000)和 Smax(≤100),分別為軌道的條數(shù)(于是軌道從 1 到 N 編號(hào))、每條軌道初始放置的物品數(shù)量、以及筐的最大容量。隨后 N 行,每行給出 M 個(gè)英文大寫字母,表示每條軌道的初始物品擺放。

最后一行給出一系列數(shù)字,順序?qū)?yīng)被按下的按鈕編號(hào),直到 ?1 標(biāo)志輸入結(jié)束,這個(gè)數(shù)字不要處理。數(shù)字間以空格分隔。題目保證至少會(huì)取出一件物品放在流水線上。

輸出格式:
在一行中順序輸出流水線上的物品,不得有任何空格。

輸入樣例:
3 4 4
GPLT
PATA
OMSA
3 2 3 0 1 2 0 2 2 0 -1
輸出樣例:
MATA

/* stack: stack <int> sta;sta.push(2); //放 sta.top(); //讀取頂層元素 sta.pop(); //彈出頂層元素(刪除) sta.size(); // 讀取棧的大小 返回類型是int, int siz = sta.size();sta.empty(); // 為空的時(shí)候返回true,不為空返回的是false queue: queue <int> q;q.push(2); //放q.front(); //讀取隊(duì)列頭元素q.pop(); // 彈出隊(duì)列頭的元素 q.size(); // 讀取隊(duì)列的大小 返回類型是int, int siz = q.size();q.empty(); // 為空的時(shí)候返回true,不為空返回的是false */ #include <bits/stdc++.h> using namespace std; const int Maxn = 100 + 10; const int Maxm = 1000 + 10; int n, m, Max; char s[Maxn][Maxm]; int ptr[Maxn]; stack <char> sta; int main() {scanf("%d%d%d", &n, &m, &Max);for(int i = 1; i <= n; i++) scanf("%s", s[i] + 1); // s[1][1] s[1][2] s[1][3]for(int i = 1; i <= n; i++) ptr[i] = 1; //第 i 條軌道上該取第一個(gè)物品 while(1) {int x;scanf("%d", &x);if(x == -1) break;else if(ptr[x] == m + 1) continue;else if(x == 0 && sta.empty()) continue;if(sta.size() == Max) {printf("%c", sta.top());sta.pop();if(x != 0)sta.push(s[x][ptr[x]++]); // ptr[x]++;}else if(x == 0) {printf("%c", sta.top());sta.pop();}else sta.push(s[x][ptr[x]++]);}return 0; }

L2-2 病毒溯源

病毒容易發(fā)生變異。某種病毒可以通過(guò)突變產(chǎn)生若干變異的毒株,而這些變異的病毒又可能被誘發(fā)突變產(chǎn)生第二代變異,如此繼續(xù)不斷變化。

現(xiàn)給定一些病毒之間的變異關(guān)系,要求你找出其中最長(zhǎng)的一條變異鏈。

在此假設(shè)給出的變異都是由突變引起的,不考慮復(fù)雜的基因重組變異問(wèn)題 —— 即每一種病毒都是由唯一的一種病毒突變而來(lái),并且不存在循環(huán)變異的情況。

輸入格式:
輸入在第一行中給出一個(gè)正整數(shù) N(≤10^4 ),即病毒種類的總數(shù)。于是我們將所有病毒從 0 到 N?1 進(jìn)行編號(hào)。

隨后 N 行,每行按以下格式描述一種病毒的變異情況:

k 變異株1 …… 變異株k
其中 k 是該病毒產(chǎn)生的變異毒株的種類數(shù),后面跟著每種變異株的編號(hào)。第 i 行對(duì)應(yīng)編號(hào)為 i 的病毒(0≤i<N)。題目保證病毒源頭有且僅有一個(gè)。

輸出格式:
首先輸出從源頭開始最長(zhǎng)變異鏈的長(zhǎng)度。

在第二行中輸出從源頭開始最長(zhǎng)的一條變異鏈,編號(hào)間以 1 個(gè)空格分隔,行首尾不得有多余空格。如果最長(zhǎng)鏈不唯一,則輸出最小序列。

注:我們稱序列 {a1 ,?,an } 比序列 { b1 ,?,bn} “小”,如果存在 1≤k≤n 滿足 ai=bi對(duì)所有 i<k 成立,且 ak<bk。
輸入樣例:
10
3 6 4 8
0
0
0
2 5 9
0
1 7
1 2
0
2 3 1
輸出樣例:
4
0 4 9 1

// 圖論建邊:采用鄰接鏈表(不是用數(shù)據(jù)結(jié)構(gòu)課學(xué)的代碼) // dfs(深度優(yōu)先算法找最長(zhǎng)鏈) // 序列比較(代碼基本功) #include <bits/stdc++.h> using namespace std; const int Maxn = 10000 + 10; const int Maxm = 200000 + 20; int Ans[Maxn], temp[Maxn]; int n, Maxdeep, ecnt, head[Maxn], rd[Maxn]; // head[i]表示點(diǎn)i的出邊信息的最后一次信息,比如i-->j,i-->l... struct list {int to; //邊指向的點(diǎn),比如a--->b,記錄的就是bint nxt; // 下一條邊 }e[Maxm]; void add_edge(int u, int v) {// 表示建立了一條從點(diǎn)u到點(diǎn)v的有向邊e[++ecnt].to = v;e[ecnt].nxt = head[u];head[u] = ecnt; }bool check(int deep) {for(int i = 1; i <= deep; i++) if(temp[i] > Ans[i]) return false;else if(temp[i] < Ans[i]) return true; }void dfs(int x, int deep) { //當(dāng)前的點(diǎn)的編號(hào)是x,當(dāng)前的鏈長(zhǎng)是deep temp[deep] = x;if(head[x] == 0) { //這個(gè)點(diǎn)走到頭了,他不會(huì)突變成別的病毒了,這個(gè)點(diǎn)沒有出邊if(deep > Maxdeep) {for(int i = 1; i <= deep; i++)Ans[i] = temp[i];Maxdeep = deep;} else if(deep == Maxdeep) {if(check(deep) == true)for(int i = 1; i <= deep; i++)Ans[i] = temp[i];}return;}for(int i = head[x]; i; i = e[i].nxt) { // 鄰接鏈表的使用 int To = e[i].to;dfs(To, deep + 1);} } int main() {scanf("%d", &n);for(int u = 0; u < n; u++) {int k;scanf("%d", &k);for(int j = 1; j <= k; j++) {int v;scanf("%d", &v);add_edge(u, v);rd[v]++;}}for(int i = 0; i < n; i++) {if(!rd[i]) {dfs(i, 1); // 從點(diǎn)i開始進(jìn)行搜索,當(dāng)前搜索的鏈長(zhǎng)為1; }}printf("%d\n", Maxdeep);for(int i = 1; i < Maxdeep; i++)printf("%d ", Ans[i]);printf("%d", Ans[Maxdeep]);return 0; }

L2-3 清點(diǎn)代碼庫(kù)


上圖轉(zhuǎn)自新浪微博:“阿里代碼庫(kù)有幾億行代碼,但其中有很多功能重復(fù)的代碼,比如單單快排就被重寫了幾百遍。請(qǐng)?jiān)O(shè)計(jì)一個(gè)程序,能夠?qū)⒋a庫(kù)中所有功能重復(fù)的代碼找出。各位大佬有啥想法,我當(dāng)時(shí)就懵了,然后就掛了。。?!?/p>

這里我們把問(wèn)題簡(jiǎn)化一下:首先假設(shè)兩個(gè)功能模塊如果接受同樣的輸入,總是給出同樣的輸出,則它們就是功能重復(fù)的;其次我們把每個(gè)模塊的輸出都簡(jiǎn)化為一個(gè)整數(shù)(在 int 范圍內(nèi))。于是我們可以設(shè)計(jì)一系列輸入,檢查所有功能模塊的對(duì)應(yīng)輸出,從而查出功能重復(fù)的代碼。你的任務(wù)就是設(shè)計(jì)并實(shí)現(xiàn)這個(gè)簡(jiǎn)化問(wèn)題的解決方案。

輸入格式:
輸入在第一行中給出 2 個(gè)正整數(shù),依次為 N(≤10^4)和 M(≤10^2),對(duì)應(yīng)功能模塊的個(gè)數(shù)和系列測(cè)試輸入的個(gè)數(shù)。

隨后 N 行,每行給出一個(gè)功能模塊的 M 個(gè)對(duì)應(yīng)輸出,數(shù)字間以空格分隔。

輸出格式:
首先在第一行輸出不同功能的個(gè)數(shù) K。隨后 K 行,每行給出具有這個(gè)功能的模塊的個(gè)數(shù),以及這個(gè)功能的對(duì)應(yīng)輸出。數(shù)字間以 1 個(gè)空格分隔,行首尾不得有多余空格。輸出首先按模塊個(gè)數(shù)非遞增順序,如果有并列,則按輸出序列的遞增序給出。

注:所謂數(shù)列 { A1 , …, AM } 比 { B1 , …, BM} 大,是指存在 1≤i<M,使得 A1=B1 ,…,Ai=Bi成立,且 Ai+1>Bi+1。

輸入樣例:
7 3
35 28 74
-1 -1 22
28 74 35
-1 -1 22
11 66 0
35 28 74
35 28 74
輸出樣例:
4
3 35 28 74
2 -1 -1 22
1 11 66 0
1 28 74 35

// map: /* map <char, int> mp; mp['c'] = 2; printf("%d", mp['c']);map <int, int> mp; mp[1] = 2; printf("%d", mp[1]); */ // vector: // 自定義排序 #include <bits/stdc++.h> using namespace std; int n, m; map <vector<int>, int> mp; struct pro {vector <int> v;int c;bool operator < (const pro& vv) const {if(c == vv.c) return v < vv.v;return c > vv.c;} }; vector <pro> ans; int main() {scanf("%d%d", &n, &m);for(int i = 0; i < n; i++) {vector <int> v;for(int j = 0; j < m; j++) {int x;scanf("%d", &x);v.push_back(x);}if(mp.count(v)) mp[v]++;else mp[v] = 1;}printf("%d\n", mp.size());for(auto i : mp) {pro t;t.c = i.second, t.c = i.first();ans.push_back(t);}sort(ans.begin(), ans.end());for(auto i : ans) {printf("%d", i.c);for(auto j : i.v) printf(" %d", j);printf("\n");}return 0; }

L2-4 哲哲打游戲

哲哲是一位硬核游戲玩家。最近一款名叫《達(dá)諾達(dá)諾》的新游戲剛剛上市,哲哲自然要快速攻略游戲,守護(hù)硬核游戲玩家的一切!

為簡(jiǎn)化模型,我們不妨假設(shè)游戲有 N 個(gè)劇情點(diǎn),通過(guò)游戲里不同的操作或選擇可以從某個(gè)劇情點(diǎn)去往另外一個(gè)劇情點(diǎn)。此外,游戲還設(shè)置了一些存檔,在某個(gè)劇情點(diǎn)可以將玩家的游戲進(jìn)度保存在一個(gè)檔位上,讀取存檔后可以回到劇情點(diǎn),重新進(jìn)行操作或者選擇,到達(dá)不同的劇情點(diǎn)。

為了追蹤硬核游戲玩家哲哲的攻略進(jìn)度,你打算寫一個(gè)程序來(lái)完成這個(gè)工作。假設(shè)你已經(jīng)知道了游戲的全部劇情點(diǎn)和流程,以及哲哲的游戲操作,請(qǐng)你輸出哲哲的游戲進(jìn)度。

輸入格式:
輸入第一行是兩個(gè)正整數(shù) N 和 M (1≤N,M≤10^5),表示總共有 N 個(gè)劇情點(diǎn),哲哲有 M 個(gè)游戲操作。
接下來(lái)的 N 行,每行對(duì)應(yīng)一個(gè)劇情點(diǎn)的發(fā)展設(shè)定。第 i 行的第一個(gè)數(shù)字是 Ki?,表示劇情點(diǎn) i 通過(guò)一些操作或選擇能去往下面 Ki?個(gè)劇情點(diǎn);接下來(lái)有 Ki?個(gè)數(shù)字,第 k 個(gè)數(shù)字表示做第 k 個(gè)操作或選擇可以去往的劇情點(diǎn)編號(hào)。

最后有 M 行,每行第一個(gè)數(shù)字是 0、1 或 2,分別表示:

0 表示哲哲做出了某個(gè)操作或選擇,后面緊接著一個(gè)數(shù)字 j,表示哲哲在當(dāng)前劇情點(diǎn)做出了第 j 個(gè)選擇。我們保證哲哲的選擇永遠(yuǎn)是合法的。
1 表示哲哲進(jìn)行了一次存檔,后面緊接著是一個(gè)數(shù)字 j,表示存檔放在了第 j 個(gè)檔位上。
2 表示哲哲進(jìn)行了一次讀取存檔的操作,后面緊接著是一個(gè)數(shù)字 j,表示讀取了放在第 j 個(gè)位置的存檔。
約定:所有操作或選擇以及劇情點(diǎn)編號(hào)都從 1 號(hào)開始。存檔的檔位不超過(guò) 100 個(gè),編號(hào)也從 1 開始。游戲默認(rèn)從 1 號(hào)劇情點(diǎn)開始??偟倪x項(xiàng)數(shù)(即 ∑Ki?)不超過(guò) 10^6。

輸出格式:
對(duì)于每個(gè) 1(即存檔)操作,在一行中輸出存檔的劇情點(diǎn)編號(hào)。
最后一行輸出哲哲最后到達(dá)的劇情點(diǎn)編號(hào)。

輸入樣例:
10 11
3 2 3 4
1 6
3 4 7 5
1 3
1 9
2 3 5
3 1 8 5
1 9
2 8 10
0
1 1
0 3
0 1
1 2
0 2
0 2
2 2
0 3
0 1
1 1
0 2
輸出樣例:
1
3
9
10
樣例解釋:
簡(jiǎn)單給出樣例中經(jīng)過(guò)的劇情點(diǎn)順序:

1 -> 4 -> 3 -> 7 -> 8 -> 3 -> 5 -> 9 -> 10。

檔位 1 開始存的是 1 號(hào)劇情點(diǎn);檔位 2 存的是 3 號(hào)劇情點(diǎn);檔位 1 后來(lái)又存了 9 號(hào)劇情點(diǎn)。

// s[i][j] = k 表示在 劇情點(diǎn)i的第j個(gè)選擇是通向劇情k的 // vector <int> s[100000 + 10]; #include <bits/stdc++.h> using namespace std; const int Maxn = 100000 + 10; int n, m, now = 1; int rec[110]; vector <int> vec[Maxn]; int main() {scanf("%d%d", &n, &m);for(int i = 1; i <= n; i++) {int k;scanf("%d", &k);for(int j = 1; j <= k; j++) {int v;scanf("%d", &v);vec[i].push_back(v); // vec[1][0] = 2, vec[1][1] = 3 ...}}for(int i = 1; i <= m; i++) {int a, b;scanf("%d%d", &a, &b);if(a == 0) {// now 現(xiàn)在的劇情點(diǎn) // vec[now][b - 1] 將要到達(dá)的劇情點(diǎn)now = vec[now][b - 1]; }else if(a == 1) {printf("%d\n", now);rec[b] = now;}else if(a == 2) {now = rec[b];}}printf("%d", now);return 0; }

L3-1 森森旅游

好久沒出去旅游啦!森森決定去 Z 省旅游一下。

Z 省有 n 座城市(從 1 到 n 編號(hào))以及 m 條連接兩座城市的有向旅行線路(例如自駕、長(zhǎng)途汽車、火車、飛機(jī)、輪船等),每次經(jīng)過(guò)一條旅行線路時(shí)都需要支付該線路的費(fèi)用(但這個(gè)收費(fèi)標(biāo)準(zhǔn)可能不止一種,例如車票跟機(jī)票一般不是一個(gè)價(jià)格)。

Z 省為了鼓勵(lì)大家在省內(nèi)多逛逛,推出了旅游金計(jì)劃:在 i 號(hào)城市可以用 1 元現(xiàn)金兌換 ai?元旅游金(只要現(xiàn)金足夠,可以無(wú)限次兌換)。城市間的交通即可以使用現(xiàn)金支付路費(fèi),也可以用旅游金支付。具體來(lái)說(shuō),當(dāng)通過(guò)第 j 條旅行線路時(shí),可以用 cj元現(xiàn)金或 dj元旅游金支付路費(fèi)。注意: 每次只能選擇一種支付方式,不可同時(shí)使用現(xiàn)金和旅游金混合支付。但對(duì)于不同的線路,旅客可以自由選擇不同的支付方式。

森森決定從 1 號(hào)城市出發(fā),到 n 號(hào)城市去。他打算在出發(fā)前準(zhǔn)備一些現(xiàn)金,并在途中的某個(gè)城市將剩余現(xiàn)金 全部 換成旅游金后繼續(xù)旅游,直到到達(dá) n 號(hào)城市為止。當(dāng)然,他也可以選擇在 1 號(hào)城市就兌換旅游金,或全部使用現(xiàn)金完成旅程。

Z 省政府會(huì)根據(jù)每個(gè)城市參與活動(dòng)的情況調(diào)整匯率(即調(diào)整在某個(gè)城市 1 元現(xiàn)金能換多少旅游金)?,F(xiàn)在你需要幫助森森計(jì)算一下,在每次調(diào)整之后最少需要攜帶多少現(xiàn)金才能完成他的旅程。

輸入格式:
輸入在第一行給出三個(gè)整數(shù) n,m 與 q(1≤n≤10^5, 1≤m≤2×10 ^5,1≤q≤10 ^5),依次表示城市的數(shù)量、旅行線路的數(shù)量以及匯率調(diào)整的次數(shù)。

接下來(lái) m 行,每行給出四個(gè)整數(shù) u,v,c 與 d(1≤u,v≤n,1≤c,d≤10^9),表示一條從 u 號(hào)城市通向 v 號(hào)城市的有向旅行線路。每次通過(guò)該線路需要支付 c 元現(xiàn)金或 d 元旅游金。數(shù)字間以空格分隔。輸入保證從 1 號(hào)城市出發(fā),一定可以通過(guò)若干條線路到達(dá) n 號(hào)城市,但兩城市間的旅行線路可能不止一條,對(duì)應(yīng)不同的收費(fèi)標(biāo)準(zhǔn);也允許在城市內(nèi)部游玩(即 u 和 v 相同)。

接下來(lái)的一行輸入 n 個(gè)整數(shù) a1,a2,?,an(1≤ai≤10^9),其中 ai表示一開始在 i 號(hào)城市能用 1 元現(xiàn)金兌換ai個(gè)旅游金。數(shù)字間以空格分隔。
接下來(lái) q 行描述匯率的調(diào)整。第 i 行輸入兩個(gè)整數(shù) xi與ai′(1≤xi≤n,1≤ai′≤10^9),表示第 i 次匯率調(diào)整后,xi號(hào)城市能用 1 元現(xiàn)金兌換 ai′?個(gè)旅游金,而其它城市旅游金匯率不變。請(qǐng)注意:每次匯率調(diào)整都是在上一次匯率調(diào)整的基礎(chǔ)上進(jìn)行的。

輸出格式:
對(duì)每一次匯率調(diào)整,在對(duì)應(yīng)的一行中輸出調(diào)整后森森至少需要準(zhǔn)備多少現(xiàn)金,才能按他的計(jì)劃從 1 號(hào)城市旅行到 n 號(hào)城市。

再次提醒:如果森森決定在途中的某個(gè)城市兌換旅游金,那么他必須將剩余現(xiàn)金全部、一次性兌換,剩下的旅途將完全使用旅游金支付。

輸入樣例:
6 11 3
1 2 3 5
1 3 8 4
2 4 4 6
3 1 8 6
1 3 10 8
2 3 2 8
3 4 5 3
3 5 10 7
3 3 2 3
4 6 10 12
5 6 10 6
3 4 5 2 5 100
1 2
2 1
1 17
輸出樣例:
8
8
1
樣例解釋:
對(duì)于第一次匯率調(diào)整,森森可以沿著 1→2→4→6 的線路旅行,并在 2 號(hào)城市兌換旅游金;

對(duì)于第二次匯率調(diào)整,森森可以沿著 1→2→3→4→6 的線路旅行,并在 3 號(hào)城市兌換旅游金;

對(duì)于第三次匯率調(diào)整,森森可以沿著 1→3→5→6 的線路旅行,并在 1 號(hào)城市兌換旅游金。

// 迪杰斯特拉算法: 求一個(gè)點(diǎn)到其他所有點(diǎn)的距離(n^2)(優(yōu)先隊(duì)列優(yōu)化,n*logn) // 本題題意要的解法: 至少要求出點(diǎn)1到其他所有點(diǎn)的距離(n*logn)。 // 再求出每個(gè)點(diǎn)到點(diǎn)n的距離..(建立反向邊, 改成了求點(diǎn)n到其他點(diǎn)的距離) // 對(duì)于每個(gè)點(diǎn)ui就都能求出:到 點(diǎn)ui時(shí)的花費(fèi)現(xiàn)金數(shù)量qi, 點(diǎn)ui到點(diǎn)n花費(fèi)的旅游金數(shù)量pi ,至少要帶qi+[pi/ai] ([]表示向上取整) // 鄰接表建邊、迪杰斯特拉算法、會(huì)使用優(yōu)先隊(duì)列、pair類型的使用 // 高等數(shù)據(jù)結(jié)構(gòu):線段樹 (修改操作是logn(單點(diǎn)修改,不是區(qū)間修改),查詢操作也是logn,單獨(dú)查詢最小值的話是1) // 查詢的復(fù)雜度就降低成了 q*logn// 題目整體復(fù)雜度 max(n * logn, q * logn), n和q是等階的 #include <bits/stdc++.h> using namespace std; const int Maxn = 100000 + 10; const int Maxm = 200000 + 20; int n, m, t; long long tree[Maxn << 2]; // 記錄到達(dá)每個(gè)點(diǎn)的花費(fèi),同時(shí)也能記錄一段區(qū)間的最小花費(fèi) int a[Maxn]; int ecnt, head[Maxn]; int cecnt, chead[Maxn]; long long dis[Maxn], cdis[Maxn]; // dis[i]表示點(diǎn)1到點(diǎn)i的距離 cdisn[i] 表示點(diǎn)n到點(diǎn)i的距離(反向邊) bool vis[Maxn]; //表示點(diǎn)i是否作為最短路點(diǎn)進(jìn)行了對(duì)其他點(diǎn)最短路的更新 typedef pair<long long, int> pii; priority_queue <pii, vector<pii>, greater<pii> > q; // 聲明好了一個(gè)按最小值排序的小頂堆(也就是優(yōu)先隊(duì)列) struct list {int to, nxt, w; }e[Maxm], ce[Maxm]; void add_edge(int u, int v, int w) {e[++ecnt].to = v;e[ecnt].w = w;e[ecnt].nxt = head[u];head[u] = ecnt; } void add_cedge(int u, int v, int w) {ce[++cecnt].to = v;ce[cecnt].w = w;ce[cecnt].nxt = chead[u];chead[u] = cecnt; } void build_tree(int cur, int l, int r) {if(l == r) {if(dis[l] == 1e18 || cdis[l] == 1e18) tree[cur] = 2e18;else tree[cur] = dis[l] + (cdis[l] / a[l] + (cdis[l] % a[l] != 0)); return;}int mid = l + r >> 1;build_tree(cur << 1, l, mid);build_tree(cur << 1 | 1, mid + 1, r);tree[cur] = min(tree[cur << 1], tree[cur << 1 | 1]); }void modify(int cur, int l, int r, int tar, int val) {if(l == r) {a[l] = val;if(dis[l] == 1e18 || cdis[l] == 1e18) tree[cur] = 2e18;else tree[cur] = dis[l] + (cdis[l] / a[l] + (cdis[l] % a[l] != 0)); return;}int mid = l + r >> 1;if(tar <= mid) modify(cur << 1, l, mid, tar, val);else modify(cur << 1 | 1, mid + 1, r, tar, val);tree[cur] = min(tree[cur << 1], tree[cur << 1 | 1]); }int main() {scanf("%d%d%d", &n, &m, &t);for(int i = 1; i <= m; i++) {int u, v, w1, w2;scanf("%d%d%d%d", &u, &v, &w1, &w2);add_edge(u, v, w1);add_cedge(v, u, w2);}for(int i = 1; i <= n; i++) scanf("%d", &a[i]);for(int i = 1; i <= n; i++) dis[i] = cdis[i] = 1e18;dis[1] = 0;q.push(make_pair(dis[1], 1));while(!q.empty()) {int x = q.top().second;q.pop();if(vis[x]) continue;vis[x] = true;for(int i = head[x]; i; i = e[i].nxt)if(dis[x] + e[i].w < dis[e[i].to]) {dis[e[i].to] = dis[x] + e[i].w;q.push(make_pair(dis[e[i].to], e[i].to));}} for(int i = 1; i <= n; i++) vis[i] = false;cdis[n] = 0;q.push(make_pair(dis[n], n));while(!q.empty()) {int x = q.top().second;q.pop();if(vis[x]) continue;vis[x] = true;for(int i = chead[x]; i; i = ce[i].nxt)if(cdis[x] + ce[i].w < cdis[ce[i].to]) {cdis[ce[i].to] = cdis[x] + ce[i].w;q.push(make_pair(cdis[ce[i].to], ce[i].to));}} // for(int i = 1; i <= n; i++) printf("點(diǎn)1到達(dá)點(diǎn)%d的距離是:%lld,點(diǎn)%d到達(dá)點(diǎn)n的距離是:%lld\n", i, dis[i], i, cdis[i]);build_tree(1, 1, n);for(int i = 1; i <= t; i++) {int x, a_;scanf("%d%d", &x, &a_);modify(1, 1, n, x, a_);printf("%lld\n", tree[1]);}return 0; }

L3-2 還原文件

一份重要文件被撕成兩半,其中一半還被送進(jìn)了碎紙機(jī)。我們將碎紙機(jī)里找到的紙條進(jìn)行編號(hào),如圖 1 所示。然后根據(jù)斷口的折線形狀跟沒有切碎的半張紙進(jìn)行匹配,最后還原成圖 2 的樣子。要求你輸出還原后紙條的正確拼接順序。

圖1 紙條編號(hào)

圖2 還原結(jié)果

輸入格式:
輸入首先在第一行中給出一個(gè)正整數(shù) N(1<N≤10^5),為沒有切碎的半張紙上斷口折線角點(diǎn)的個(gè)數(shù);隨后一行給出從左到右 N 個(gè)折線角點(diǎn)的高度值(均為不超過(guò) 100 的非負(fù)整數(shù))。

隨后一行給出一個(gè)正整數(shù) M(≤100),為碎紙機(jī)里的紙條數(shù)量。接下去有 M 行,其中第 i 行給出編號(hào)為 i(1≤i≤M)的紙條的斷口信息,格式為:K h[1] h[2] … h[K]其中 K 是斷口折線角點(diǎn)的個(gè)數(shù)(不超過(guò) 10^4+1),后面是從左到右 K 個(gè)折線角點(diǎn)的高度值。為簡(jiǎn)單起見,這個(gè)“高度”跟沒有切碎的半張紙上斷口折線角點(diǎn)的高度是一致的。

輸出格式:
在一行中輸出還原后紙條的正確拼接順序。紙條編號(hào)間以一個(gè)空格分隔,行首尾不得有多余空格。

題目數(shù)據(jù)保證存在唯一解。

輸入樣例:
17
95 70 80 97 97 68 58 58 80 72 88 81 81 68 68 60 80
6
4 68 58 58 80
3 81 68 68
3 95 70 80
3 68 60 80
5 80 72 88 81 81
4 80 97 97 68
輸出樣例:
3 6 1 5 2 4

#include <bits/stdc++.h> using namespace std; const int Maxn = 100000 + 10; const int Maxm = 100 + 10; const int Maxk = 10000 + 10; int n, m, a[Maxn], Ans[Maxm]; int s[Maxm][Maxk]; bool suc; bool vis[Maxm];void dfs(int now, int cur) {if(cur == m + 1) {suc = true;return;}for(int i = 1; i <= m && !suc; i++)if(vis[i] == false) {bool flag = true;for(int j = 0; j < s[i][0]; j++)if(a[now + j] != s[i][j + 1]) {flag = false;break;}if(flag) {Ans[cur] = i;vis[i] = true;dfs(now + s[i][0] - 1, cur + 1);vis[i] = false;}} } int main() {scanf("%d", &n);for(int i = 1; i <= n; i++) scanf("%d", &a[i]);scanf("%d", &m);for(int i = 1; i <= m; i++) {/*int k;scanf("%d", &k);*/// s[i][j]表示第i個(gè)紙片第j個(gè)轉(zhuǎn)折點(diǎn)的高度嘛... s[i][0]沒用到,所以用來(lái)存儲(chǔ)第i個(gè)紙片的轉(zhuǎn)折點(diǎn)數(shù)量scanf("%d", &s[i][0]);for(int j = 1; j <= s[i][0]; j++)scanf("%d", &s[i][j]); }dfs(1, 1); //當(dāng)前拼到第一個(gè)轉(zhuǎn)折點(diǎn)了,目前要找第一個(gè)紙片 for(int i = 1; i < m; i++) printf("%d ", Ans[i]);printf("%d", Ans[m]);return 0; }

L3-3 可憐的簡(jiǎn)單題

九條可憐去年出了一道題,導(dǎo)致一眾參賽高手慘遭團(tuán)滅。今年她出了一道簡(jiǎn)單題 —— 打算按照如下的方式生成一個(gè)隨機(jī)的整數(shù)數(shù)列 A:

1.最開始,數(shù)列 A 為空。

2.可憐會(huì)從區(qū)間 [1,n] 中等概率隨機(jī)一個(gè)整數(shù) i 加入到數(shù)列 A 中。

3.如果不存在一個(gè)大于 1 的正整數(shù) w,滿足 A 中所有元素都是 w 的倍數(shù),數(shù)組 A 將會(huì)作為隨機(jī)生成的結(jié)果返回。否則,可憐將會(huì)返回第二步,繼續(xù)增加 A 的長(zhǎng)度。

現(xiàn)在,可憐告訴了你數(shù)列 n 的值,她希望你計(jì)算返回的數(shù)列 A 的期望長(zhǎng)度。

輸入格式:
輸入一行兩個(gè)整數(shù) n,p (1≤n≤10^11,n<p≤10 ^12 ),p 是一個(gè)質(zhì)數(shù)。

輸出格式:
在一行中輸出一個(gè)整數(shù),表示答案對(duì) p 取模的值。具體來(lái)說(shuō),假設(shè)答案的最簡(jiǎn)分?jǐn)?shù)表示為x/y ,你需要輸出最小的非負(fù)整數(shù) z 滿足 y×z≡x mod p。

輸入樣例 1:
2 998244353
輸出樣例 1:
2
輸入樣例 2:
100000000 998244353
輸出樣例 2:
3056898
(1分代碼)

#include <bits/stdc++.h> using namespace std;int main() {cout << 1 << endl;return 0; }

(滿分代碼):大神的代碼

有不懂的問(wèn)題歡迎評(píng)論哦

總結(jié)

以上是生活随笔為你收集整理的第六届团队程序设计天梯赛 全题目解析讲解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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