【Code pratice】—— 成绩统计、星系炸弹、特别数的和、蛇形填数、日志统计
Date:2022?10?02\color{FF6699}{Date:2022-10-02}Date:2022?10?02
If\color{FF6699}{If}If I\color{FF6699}{I}I can′t\color{FF6699}{can't}can′t I\color{FF6699}{I}I must;\color{FF6699}{must;}must; If\color{FF6699}{If}If I\color{FF6699}{I}I must\color{FF6699}{must}must I\color{FF6699}{I}I can!\color{FF6699}{can!}can!
文章目錄
- 🍎1. 成績統(tǒng)計🍎1
- 🍇題目🍇
- 🍇思路🍇
- 🍇代碼🍇
- 🍊2. 星系炸彈🍊
- 🍌題目🍌
- 🍌思路🍌
- 🍌代碼🍌
- 🍍3. 特別數(shù)的和🍍
- 🥭題目🥭
- 🥭思路🥭
- 🥭代碼🥭
- 🍒4. 蛇形填數(shù)🍒
- 🍑題目🍑
- 🍑思路🍑
- 🍑代碼🍑
- 🍋5. 日志統(tǒng)計🍋
- 🍉題目🍉
- 🍉思路🍉
- 🍉代碼🍉
🍎1. 成績統(tǒng)計🍎1
🍇題目🍇
編寫一個程序,建立了一條單向鏈表,每個結點包含姓名、學號、英語成績、數(shù)學成績和C++成績,并通過鏈表操作平均最高的學生和平均分最低的學生并且輸出。
輸入格式
輸入n+1行,第一行輸入一個正整數(shù)n,表示學生數(shù)量;接下來的n行每行輸入5個數(shù)據(jù),分別表示姓名、學號、英語成績、數(shù)學成績和C++成績。注意成績有可能會有小數(shù)。
輸出格式
輸出兩行,第一行輸出平均成績最高的學生姓名。第二行輸出平均成績最低的學生姓名。
樣例輸入
2 yx1 1 45 67 87 yx2 2 88 90 99🍇思路🍇
科目數(shù)量固定,所以求平均成績最高最低相當于求總分最高最低的即可。
🍇代碼🍇
void ScoreCount(int i_StudentNum) {if ((0 > i_StudentNum)){cout << "Invalid date entered." << endl;}Student stu[i_StudentNum];double scoreSum = 0.0;double minSum = 300.0;double maxSum = 0.0;string minName = "";string maxName = "";for (int i = 0; i < i_StudentNum; i++){cout << "Please input Student [" << i <<"]'s name, id, english score, math score, cplusplus score: " << endl;cin >> stu[i].name >> stu[i].id >> stu[i].english >> stu[i].math >> stu[i].cplusplus;scoreSum = stu[i].math + stu[i].english + stu[i].cplusplus;if (minSum > scoreSum){minSum = scoreSum;minName = stu[i].name;}if (maxSum < scoreSum){maxSum = scoreSum;maxName = stu[i].name;}}cout << "The person with the lowest average score is [" << minName << "]." << endl;cout << "The person with the highest average score is [" << maxName << "]." << endl; }🍊2. 星系炸彈🍊
🍌題目🍌
在X星系的廣袤空間中漂浮著許多X星人造“炸彈”,用來作為宇宙中的路標。
每個炸彈都可以設定多少天之后爆炸。
比如:阿爾法炸彈2015年1月1日放置,定時為15天,則它在2015年1月16日爆炸。
有一個貝塔炸彈,2014年11月9日放置,定時為1000天,請你計算它爆炸的準確日期。
🍌思路🍌
炸彈會在定時達到那天爆炸,也就是當定時時間從N減到0時的那天就是爆炸的準確日期,那么本題只需要通過遞減定時時間的同時,計算新的日期即可,要注意的是
🍌代碼🍌
int GalaxyBomb(int i_Year, int i_Mon, int i_Day, int i_Timing) {if (!IsValidDate(i_Year, i_Mon, i_Day)){return -1;}int curYear = i_Year;int curMon = i_Mon;int curDay = i_Day;while (i_Timing){bool IsSpecialDay = false;if (2 == curMon){if (IsLeapYear(curYear)){if (29 == curDay){curDay = 1;curMon++;IsSpecialDay = true;}}else{if (28 == curDay){curDay = 1;curMon++;IsSpecialDay = true;}}}else if (sBigMonth(curMon)){if (12 == curMon){if (31 == curDay){curDay = 1;curMon = 1;curYear++;IsSpecialDay = true;}}if (31 == curDay){curDay = 1;curMon++;IsSpecialDay = true;}}else{if (30 == curDay){curDay = 1;curMon++;IsSpecialDay = true;}}if (!IsSpecialDay){curDay++;}i_Timing--;}char strDate[100];memset(strDate, 0, 100);sprintf(strDate, "The bomb will explode on %d-%d-%d", curYear, curMon, curDay);cout << strDate << endl;return 1; }🍍3. 特別數(shù)的和🍍
🥭題目🥭
小明對數(shù)位中含有 2、0、1、9 的數(shù)字很感興趣(不包括前導 0),在 1 到 40 中這樣的數(shù)包括 1、2、9、10 至 32、39 和 40,共 28 個,他們的和是 574。
請問,在 1 到 n 中,所有這樣的數(shù)的和是多少?
輸入格式
共一行,包含一個整數(shù) n。
輸出格式
共一行,包含一個整數(shù),表示滿足條件的數(shù)的和。
🥭思路🥭
只需要遍歷從1到N的所有數(shù)字,如果該數(shù)字中包含[2, 0, 1, 9]就進行相加即可
🥭代碼🥭
int SumOfSpecialNum(int i_Inter) {if ((0 > i_Inter) || (10000 < i_Inter)){return -1;}int o_sum = 0;for (int i = 1; i <= i_Inter; i++){int j = i;while (j){int tmp = j % 10;if ((2 == tmp) || (0 == tmp) || (1 == tmp) || (9 == tmp)){cout << i << endl;o_sum += i;break;}j /= 10;}}return o_sum; }🍒4. 蛇形填數(shù)🍒
🍑題目🍑
| 3 | 5 | 8 | 14 | … | |
| 4 | 9 | 13 | … | ||
| 10 | 12 | … | |||
| 11 | … | ||||
| … | |||||
| 蛇形矩陣如上,容易看出矩陣第二行第二列中的數(shù)是5。請你計算矩陣中第20 行第20 列的數(shù)是多少? |
🍑思路🍑
蛇形矩陣的規(guī)律就是碰到邊界就往回走,那么本題實際只需要做好邊界判定的邏輯即可
🍑代碼🍑
int SnakeMatrix(int i_X, int i_Y) {if ((0 >= i_X) || (0 >= i_Y)){return -1;}int MatrixLen = (i_X > i_Y) ? ((i_X * 2) - 1) : ((i_Y * 2) - 1);int MatrixItemStart = 1;int i = 0;int j = 0;bool Process = false;vector<vector<int> > Matrix(MatrixLen, vector<int>(MatrixLen, 0)); Matrix[0][0] = MatrixItemStart++;while (1){if (0 != Matrix[i_X - 1][i_Y - 1]){break;}j++;while (-1 != j){Matrix[i][j] = MatrixItemStart++;if (0 == j){break;}i++;j--;}i++;while (-1 != i){Matrix[i][j] = MatrixItemStart++;if (0 == i){break;}i--;j++;}}return Matrix[i_X - 1][i_Y - 1]; }🍋5. 日志統(tǒng)計🍋
🍉題目🍉
小明維護著一個程序員論壇。現(xiàn)在他收集了一份”點贊”日志,日志共有 N 行。
其中每一行的格式是:
ts id
表示在 ts 時刻編號 id 的帖子收到一個”贊”。
現(xiàn)在小明想統(tǒng)計有哪些帖子曾經(jīng)是”熱帖”。
如果一個帖子曾在任意一個長度為 D 的時間段內(nèi)收到不少于 K 個贊,小明就認為這個帖子曾是”熱帖”。
具體來說,如果存在某個時刻 T 滿足該帖在 [T,T+D) 這段時間內(nèi)(注意是左閉右開區(qū)間)收到不少于 K 個贊,該帖就曾是”熱帖”。
給定日志,請你幫助小明統(tǒng)計出所有曾是”熱帖”的帖子編號。
輸入格式
第一行包含三個整數(shù) N,D,K。
以下 N 行每行一條日志,包含兩個整數(shù) ts 和 id。
輸出格式
按從小到大的順序輸出熱帖 id。
每個 id 占一行。
輸入樣例:
7 10 2
0 1
0 10
10 10
10 1
9 1
100 3
100 3
輸出樣例:
1
3
🍉思路🍉
題目要求:升序輸出所有的熱帖id
那么關鍵點就是怎么判斷是不是熱帖?
存在某個時刻 T 滿足該帖在 [T,T+D) 這段時間內(nèi)(注意是左閉右開區(qū)間)收到不少于 K 個贊,該帖就曾是”熱帖”。
這里舉個例子就比如此時D = 10, K = 2
帖子a和帖子b在1時刻收到一個贊,然后帖子a在10時刻再次收到一個贊,帖子b在11時刻也收到一個贊
對于帖子a來說:在 [1, 11) 這個時間段里收到了兩個贊,所以a是熱帖
對于帖子b來說:在 [1, 11) 這個時間段里只有一個贊,第二個贊是在11時刻收到的,不在區(qū)間內(nèi)
所以具體思路如下:
🍉代碼🍉
vector<int> LogStatistics(int i_Nth, int i_Dth, int i_Praisenum) {vector<int> result = {-1};if ((1 > i_Nth || 100000 < i_Nth)|| (1 > i_Dth || 10000 < i_Dth)|| (1 > i_Praisenum || 100000 < i_Praisenum)){return result;}vector<int> IsValidId; // 記錄符合條件的IDvector<int> IdFrequency(200, 0); // 記錄每個ID出現(xiàn)的次數(shù)vector<vector<int> > IdEveryTime(200, vector<int>(200, 0)); // 記錄每個ID每次出現(xiàn)的時間,行為 id, 列為 tsfor (int i = 0; i < i_Nth; i++){int ts = 0;int id = 0;cout << "Please input [" << i << "]'s ts id: ";cin >> ts >> id;IdFrequency[id]++;if (i_Praisenum == IdFrequency[id]){IsValidId.push_back(id);}IdEveryTime[id][IdFrequency[id]] = ts;}sort(IsValidId.begin() + 1, IsValidId.end());for (int i = 0; i < IsValidId.size(); i++){vector<int> IdTime; // 記錄每個 id 出現(xiàn)的時間for (int j = 1; j <= IdFrequency[IsValidId[i]]; j++){IdTime.push_back(IdEveryTime[IsValidId[i]][j]);}sort(IdTime.begin(), IdTime.end());if (i_Dth > (IdTime[i_Praisenum - 1] - IdTime[0])){result.push_back(IsValidId[i]);}}sort(result.begin(), result.end());return result; }總結
以上是生活随笔為你收集整理的【Code pratice】—— 成绩统计、星系炸弹、特别数的和、蛇形填数、日志统计的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 阿里云视频点播——企业服务
- 下一篇: Centos 6/7安装Torque(单