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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

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

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

題號題目名稱
L1-1人與神
L1-2兩小時學完C語言
L1-3強迫癥
L1-4降價提醒機器人
L1-5大笨鐘的心情
L1-6吉老師的回歸
L1-7天梯賽的善良
L1-8乘法口訣數列
L2-1包裝機
L2-2病毒溯源
L2-3清點代碼庫
L2-4哲哲打游戲
L3-1森森旅游
L3-2還原文件
L3-3可憐的簡單題

AC代碼:

L1-1 人與神

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

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

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

輸入樣例:

輸出樣例:
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 兩小時學完C語言

知乎上有個寶寶問:“兩個小時內如何學完 C 語言?”當然,問的是“學完”并不是“學會”。

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

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

題目保證寶寶看完的字數不超過 N。

輸出格式:
在一行中輸出寶寶還沒有看的字數。

輸入樣例:
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 強迫癥

小強在統計一個小區里居民的出生年月,但是發現大家填寫的生日格式不統一,例如有的人寫 199808,有的人只寫 9808。有強迫癥的小強請你寫個程序,把所有人的出生年月都整理成 年年年年-月月 格式。對于那些只寫了年份后兩位的信息,我們默認小于 22 都是 20 開頭的,其他都是 19 開頭的。

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

輸出格式:
在一行中按標準格式 年年年年-月月 將輸入的信息整理輸出。

輸入樣例 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 降價提醒機器人

小 T 想買一個玩具很久了,但價格有些高,他打算等便宜些再買。但天天盯著購物網站很麻煩,請你幫小 T 寫一個降價提醒機器人,當玩具的當前價格比他設定的價格便宜時發出提醒。

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

接下來 N 行,每行有一個實數 Pi?(?1000.0<Pi?<1000.0),表示一條價格記錄。

輸出格式:
對每一條比設定價格 M 便宜的價格記錄 P,在一行中輸出 On Sale! P,其中 P 輸出到小數點后 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 大笨鐘的心情

有網友問:未來還會有更多大笨鐘題嗎?笨鐘回復說:看心情……

本題就請你替大笨鐘寫一個程序,根據心情自動輸出回答。

輸入格式:
輸入在一行中給出 24 個 [0, 100] 區間內的整數,依次代表大笨鐘在一天 24 小時中,每個小時的心情指數。

隨后若干行,每行給出一個 [0, 23] 之間的整數,代表網友詢問笨鐘這個問題的時間點。當出現非法的時間點時,表示輸入結束,這個非法輸入不要處理。題目保證至少有 1 次詢問。

輸出格式:
對每一次提問,如果當時笨鐘的心情指數大于 50,就在一行中輸出 心情指數 Yes,否則輸出 心情指數 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 吉老師的回歸

曾經在天梯賽大殺四方的吉老師決定回歸天梯賽賽場啦!

為了簡化題目,我們不妨假設天梯賽的每道題目可以用一個不超過 500 的、只包括可打印符號的字符串描述出來,如:Problem A: Print “Hello world!”。

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

現在給定這次天梯賽總共有幾道題目以及吉老師已經做完了幾道題目,請你告訴大家吉老師現在正在做哪個題,或者吉老師已經把所有他打算做的題目做完了。

提醒:天梯賽有分數升級的規則,如果不做簽到題可能導致團隊總分不足以升級,一般的選手請千萬不要學習吉老師的酷炫行為!

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

接下來 N 行,每行是一個符合題目描述的字符串,表示天梯賽的題目內容。吉老師會按照給出的順序看題——第一行就是吉老師看的第一道題,第二行就是第二道,以此類推。

輸出格式:
在一行中輸出吉老師當前正在做的題目對應的題面(即做完了 M 道題目后,吉老師正在做哪個題)。如果吉老師已經把所有他打算做的題目做完了,輸出一行 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的時候,說明這行字符串不包含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') // 說明包含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 天梯賽的善良

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

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

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

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

輸入樣例:
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 乘法口訣數列

本題要求你從任意給定的兩個 1 位數字 a1?和a2開始,用乘法口訣生成一個數列 {an?},規則為從a1?開始順次進行,每次將當前數字與后面一個數字相乘,將結果貼在數列末尾。如果結果不是 1 位數,則其每一位都應成為數列的一項。

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

輸出格式:
在一行中輸出數列的前 n 項。數字間以 1 個空格分隔,行首尾不得有多余空格。

輸入樣例:
2 3 10
輸出樣例:
2 3 6 1 8 6 8 4 8 4
樣例解釋:
數列前 2 項為 2 和 3。從 2 開始,因為 2×3=6,所以第 3 項是 6。因為 3×6=18,所以第 4、5 項分別是 1、8。依次類推…… 最后因為第 6 項有 6×8=48,對應第 10、11 項應該是 4、8。而因為只要求輸出前 10 項,所以在輸出 4 后結束。

#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 包裝機

一種自動包裝機的結構如圖 1 所示。首先機器中有 N 條軌道,放置了一些物品。軌道下面有一個筐。當某條軌道的按鈕被按下時,活塞向左推動,將軌道盡頭的一件物品推落筐中。當 0 號按鈕被按下時,機械手將抓取筐頂部的一件物品,放到流水線上。圖 2 顯示了順序按下按鈕 3、2、3、0、1、2、0 后包裝機的狀態。

圖1 自動包裝機的結構

圖 2 順序按下按鈕 3、2、3、0、1、2、0 后包裝機的狀態

一種特殊情況是,因為筐的容量是有限的,當筐已經滿了,但仍然有某條軌道的按鈕被按下時,系統應強制啟動 0 號鍵,先從筐里抓出一件物品,再將對應軌道的物品推落。此外,如果軌道已經空了,再按對應的按鈕不會發生任何事;同樣的,如果筐是空的,按 0 號按鈕也不會發生任何事。

現給定一系列按鈕操作,請你依次列出流水線上的物品。

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

最后一行給出一系列數字,順序對應被按下的按鈕編號,直到 ?1 標志輸入結束,這個數字不要處理。數字間以空格分隔。題目保證至少會取出一件物品放在流水線上。

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

輸入樣例:
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(); // 為空的時候返回true,不為空返回的是false queue: queue <int> q;q.push(2); //放q.front(); //讀取隊列頭元素q.pop(); // 彈出隊列頭的元素 q.size(); // 讀取隊列的大小 返回類型是int, int siz = q.size();q.empty(); // 為空的時候返回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 條軌道上該取第一個物品 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 病毒溯源

病毒容易發生變異。某種病毒可以通過突變產生若干變異的毒株,而這些變異的病毒又可能被誘發突變產生第二代變異,如此繼續不斷變化。

現給定一些病毒之間的變異關系,要求你找出其中最長的一條變異鏈。

在此假設給出的變異都是由突變引起的,不考慮復雜的基因重組變異問題 —— 即每一種病毒都是由唯一的一種病毒突變而來,并且不存在循環變異的情況。

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

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

k 變異株1 …… 變異株k
其中 k 是該病毒產生的變異毒株的種類數,后面跟著每種變異株的編號。第 i 行對應編號為 i 的病毒(0≤i<N)。題目保證病毒源頭有且僅有一個。

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

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

注:我們稱序列 {a1 ,?,an } 比序列 { b1 ,?,bn} “小”,如果存在 1≤k≤n 滿足 ai=bi對所有 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

// 圖論建邊:采用鄰接鏈表(不是用數據結構課學的代碼) // dfs(深度優先算法找最長鏈) // 序列比較(代碼基本功) #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]表示點i的出邊信息的最后一次信息,比如i-->j,i-->l... struct list {int to; //邊指向的點,比如a--->b,記錄的就是bint nxt; // 下一條邊 }e[Maxm]; void add_edge(int u, int v) {// 表示建立了一條從點u到點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) { //當前的點的編號是x,當前的鏈長是deep temp[deep] = x;if(head[x] == 0) { //這個點走到頭了,他不會突變成別的病毒了,這個點沒有出邊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); // 從點i開始進行搜索,當前搜索的鏈長為1; }}printf("%d\n", Maxdeep);for(int i = 1; i < Maxdeep; i++)printf("%d ", Ans[i]);printf("%d", Ans[Maxdeep]);return 0; }

L2-3 清點代碼庫


上圖轉自新浪微博:“阿里代碼庫有幾億行代碼,但其中有很多功能重復的代碼,比如單單快排就被重寫了幾百遍。請設計一個程序,能夠將代碼庫中所有功能重復的代碼找出。各位大佬有啥想法,我當時就懵了,然后就掛了。。。”

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

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

隨后 N 行,每行給出一個功能模塊的 M 個對應輸出,數字間以空格分隔。

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

注:所謂數列 { 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 哲哲打游戲

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

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

為了追蹤硬核游戲玩家哲哲的攻略進度,你打算寫一個程序來完成這個工作。假設你已經知道了游戲的全部劇情點和流程,以及哲哲的游戲操作,請你輸出哲哲的游戲進度。

輸入格式:
輸入第一行是兩個正整數 N 和 M (1≤N,M≤10^5),表示總共有 N 個劇情點,哲哲有 M 個游戲操作。
接下來的 N 行,每行對應一個劇情點的發展設定。第 i 行的第一個數字是 Ki?,表示劇情點 i 通過一些操作或選擇能去往下面 Ki?個劇情點;接下來有 Ki?個數字,第 k 個數字表示做第 k 個操作或選擇可以去往的劇情點編號。

最后有 M 行,每行第一個數字是 0、1 或 2,分別表示:

0 表示哲哲做出了某個操作或選擇,后面緊接著一個數字 j,表示哲哲在當前劇情點做出了第 j 個選擇。我們保證哲哲的選擇永遠是合法的。
1 表示哲哲進行了一次存檔,后面緊接著是一個數字 j,表示存檔放在了第 j 個檔位上。
2 表示哲哲進行了一次讀取存檔的操作,后面緊接著是一個數字 j,表示讀取了放在第 j 個位置的存檔。
約定:所有操作或選擇以及劇情點編號都從 1 號開始。存檔的檔位不超過 100 個,編號也從 1 開始。游戲默認從 1 號劇情點開始。總的選項數(即 ∑Ki?)不超過 10^6。

輸出格式:
對于每個 1(即存檔)操作,在一行中輸出存檔的劇情點編號。
最后一行輸出哲哲最后到達的劇情點編號。

輸入樣例:
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
樣例解釋:
簡單給出樣例中經過的劇情點順序:

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

檔位 1 開始存的是 1 號劇情點;檔位 2 存的是 3 號劇情點;檔位 1 后來又存了 9 號劇情點。

// s[i][j] = k 表示在 劇情點i的第j個選擇是通向劇情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 現在的劇情點 // vec[now][b - 1] 將要到達的劇情點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 編號)以及 m 條連接兩座城市的有向旅行線路(例如自駕、長途汽車、火車、飛機、輪船等),每次經過一條旅行線路時都需要支付該線路的費用(但這個收費標準可能不止一種,例如車票跟機票一般不是一個價格)。

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

森森決定從 1 號城市出發,到 n 號城市去。他打算在出發前準備一些現金,并在途中的某個城市將剩余現金 全部 換成旅游金后繼續旅游,直到到達 n 號城市為止。當然,他也可以選擇在 1 號城市就兌換旅游金,或全部使用現金完成旅程。

Z 省政府會根據每個城市參與活動的情況調整匯率(即調整在某個城市 1 元現金能換多少旅游金)。現在你需要幫助森森計算一下,在每次調整之后最少需要攜帶多少現金才能完成他的旅程。

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

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

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

輸出格式:
對每一次匯率調整,在對應的一行中輸出調整后森森至少需要準備多少現金,才能按他的計劃從 1 號城市旅行到 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
樣例解釋:
對于第一次匯率調整,森森可以沿著 1→2→4→6 的線路旅行,并在 2 號城市兌換旅游金;

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

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

// 迪杰斯特拉算法: 求一個點到其他所有點的距離(n^2)(優先隊列優化,n*logn) // 本題題意要的解法: 至少要求出點1到其他所有點的距離(n*logn)。 // 再求出每個點到點n的距離..(建立反向邊, 改成了求點n到其他點的距離) // 對于每個點ui就都能求出:到 點ui時的花費現金數量qi, 點ui到點n花費的旅游金數量pi ,至少要帶qi+[pi/ai] ([]表示向上取整) // 鄰接表建邊、迪杰斯特拉算法、會使用優先隊列、pair類型的使用 // 高等數據結構:線段樹 (修改操作是logn(單點修改,不是區間修改),查詢操作也是logn,單獨查詢最小值的話是1) // 查詢的復雜度就降低成了 q*logn// 題目整體復雜度 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]; // 記錄到達每個點的花費,同時也能記錄一段區間的最小花費 int a[Maxn]; int ecnt, head[Maxn]; int cecnt, chead[Maxn]; long long dis[Maxn], cdis[Maxn]; // dis[i]表示點1到點i的距離 cdisn[i] 表示點n到點i的距離(反向邊) bool vis[Maxn]; //表示點i是否作為最短路點進行了對其他點最短路的更新 typedef pair<long long, int> pii; priority_queue <pii, vector<pii>, greater<pii> > q; // 聲明好了一個按最小值排序的小頂堆(也就是優先隊列) 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("點1到達點%d的距離是:%lld,點%d到達點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 還原文件

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

圖1 紙條編號

圖2 還原結果

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

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

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

題目數據保證存在唯一解。

輸入樣例:
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個紙片第j個轉折點的高度嘛... s[i][0]沒用到,所以用來存儲第i個紙片的轉折點數量scanf("%d", &s[i][0]);for(int j = 1; j <= s[i][0]; j++)scanf("%d", &s[i][j]); }dfs(1, 1); //當前拼到第一個轉折點了,目前要找第一個紙片 for(int i = 1; i < m; i++) printf("%d ", Ans[i]);printf("%d", Ans[m]);return 0; }

L3-3 可憐的簡單題

九條可憐去年出了一道題,導致一眾參賽高手慘遭團滅。今年她出了一道簡單題 —— 打算按照如下的方式生成一個隨機的整數數列 A:

1.最開始,數列 A 為空。

2.可憐會從區間 [1,n] 中等概率隨機一個整數 i 加入到數列 A 中。

3.如果不存在一個大于 1 的正整數 w,滿足 A 中所有元素都是 w 的倍數,數組 A 將會作為隨機生成的結果返回。否則,可憐將會返回第二步,繼續增加 A 的長度。

現在,可憐告訴了你數列 n 的值,她希望你計算返回的數列 A 的期望長度。

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

輸出格式:
在一行中輸出一個整數,表示答案對 p 取模的值。具體來說,假設答案的最簡分數表示為x/y ,你需要輸出最小的非負整數 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; }

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

有不懂的問題歡迎評論哦

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产视频xxxx | 亚洲19p| 亚洲国产97 | 欧美日韩一级二级三级 | 君岛美绪在线 | 黄页视频在线免费观看 | 姝姝窝人体www聚色窝 | 国产伦精品一区二区三区视频黑人 | 黑人性高潮 | 欧美性大战久久久久久久蜜桃 | 韩日av在线 | 放荡闺蜜高h苏桃情事h | 国产区精品在线 | 久久久久久亚洲中文字幕无码 | aaa国产精品 | 中文字幕8 | 婷婷在线一区 | 偷拍第1页 | 亚洲av毛片一区二二区三三区 | 百合sm惩罚室羞辱调教 | 国产真人无遮挡作爱免费视频 | 精品欧美一区二区在线观看 | 欧美性做爰猛烈叫床潮 | 黄色av播放 | 精品欧美一区二区久久久久 | 黄色网占 | 噼里啪啦免费观看 | 天堂久久爱 | 日韩欧美一级视频 | 久久久www免费人成人片 | 澳门av在线 | 玖玖在线观看 | 插插插91| 国产亚洲精品久久久久婷婷瑜伽 | 国产美女www | 蜜桃久久av一区 | 中文日韩 | 亚洲视频欧美 | 西西4444www大胆无视频 | 成人午夜一区二区 | www.av在线| 日韩亚洲欧美一区二区三区 | 性欧美在线视频观看 | 国产日韩欧美一二三区 | 天堂新版8中文在线8 | 中文字幕1页 | 亚洲成av人片在线观看无 | 大乳护士喂奶hd | 日本免费三区 | 51调教丨国产调教视频 | 国产乱码精品一区二区 | 大牛影视剧免费播放在线 | 久草免费在线观看视频 | 九九天堂网| 性——交——性——乱免费的 | 黄色无遮挡网站 | av男人的天堂av | 国产女人和拘做受视频免费 | 国产一级二级三级在线观看 | 国产精品videossex久久发布 | 欧洲精品视频在线 | 国产精品免费av一区二区三区 | 在线观看黄av | 久草视频免费在线播放 | 8050午夜二级 | 三级免费观看 | 麻豆视频免费在线 | 久操成人 | 97精品人妻一区二区三区香蕉 | 国产高清一区二区 | 99视频精品 | 国内自拍偷拍 | 亚洲第一大网站 | 亚洲欧美日韩综合在线 | 大尺度做爰呻吟舌吻情头 | 一个人看的www日本高清视频 | 日日干夜夜操 | 国产高清视频一区二区 | 91精品影视 | 妺妺窝人体色www婷婷 | 久久精品久久国产 | 8x8x国产精品一区二区 | 国产精品久久AV无码 | 岛国一区二区 | 国产经典一区二区三区 | 精品国产乱码久久久久久久 | 熟妇高潮一区二区三区 | 少妇高潮一区二区三区99小说 | 国产一区毛片 | 免费看黄色aaaaaa 片 | 亚洲在线精品视频 | 精品日本一区二区三区 | 尤物视频免费观看 | 色婷婷免费 | 日韩在线色 | 岛国毛片在线观看 | 国内精品一区二区三区 | 亚洲777 | 黄色日批视频 |