7-37 模拟EXCEL排序 (25 分)(思路+详解+超时解决 兄弟们冲呀呀呀呀呀呀)
一:題目
Excel可以對一組紀錄按任意指定列排序。現(xiàn)請編寫程序?qū)崿F(xiàn)類似功能。
輸入格式:
輸入的第一行包含兩個正整數(shù)N(≤10
5
) 和C,其中N是紀錄的條數(shù),C是指定排序的列號。之后有 N行,每行包含一條學生紀錄。每條學生紀錄由學號(6位數(shù)字,保證沒有重復的學號)、姓名(不超過8位且不包含空格的字符串)、成績([0, 100]內(nèi)的整數(shù))組成,相鄰屬性用1個空格隔開。
輸出格式:
在N行中輸出按要求排序后的結(jié)果,即:當C=1時,按學號遞增排序;當C=2時,按姓名的非遞減字典序排序;當C=3時,按成績的非遞減排序。當若干學生具有相同姓名或者相同成績時,則按他們的學號遞增排序。
輸入樣例:
3 1 000007 James 85 000010 Amy 90 000001 Zoe 60輸出樣例:
000001 Zoe 60 000007 James 85 000010 Amy 90二:思路
這個題是用結(jié)構(gòu)體存儲 學號 姓名 成績 三個變量,然后重寫sort函數(shù)。
三:上碼
/**思路:利用結(jié)構(gòu)體存下,學號,姓名,成績 ;然后重寫sort函數(shù)*/#include<bits/stdc++.h> using namespace std;struct Node{string id;string name;int grade; };bool sort_id( Node a,Node b ){return a.id < b.id;}bool sort_name( Node a, Node b ){if( a.name == b.name ) //當名字相同時,按照id進行排序 return a.id < b.id;return a.name < b.name; }bool sort_grade( Node a, Node b ){if( a.grade == b.grade)//當成績相同時,按照id進行排序 return a.id < b.id; return a.grade < b.grade; } int main(){int N,M;cin >> N >> M;//創(chuàng)建結(jié)構(gòu)體數(shù)組Node *node = new Node[N]; for( int i = 0; i < N; i++ ){cin >> node[i].id >> node[i].name >> node[i].grade;}if( M == 1)sort(node,node+N,sort_id);if( M == 2)sort(node,node+N,sort_name);if( M == 3)sort(node,node+N,sort_grade);for( int i = 0; i < N; i++ ){cout << node[i].id << ' ' << node[i].name << ' ' << node[i].grade << endl;} }補充超時解決:
1.這個需要卡時間,多提交幾次就還可以卡過去。2.或則將cout cin 改成printf 和 scanf這些都是我的做題經(jīng)驗,親試有效,但如果還不行,那就回爐重造。重新構(gòu)思路,重新編碼,一旦你寫出來,再怎么改還是原來的套路,很可能還是過不去。四:總結(jié)和踩過的坑
這個題思路是我第一次這么寫,很明顯,不是我想出來的,我是學習大佬的。但是我還是自己做了遍,用的是map容器,其時用map是不對的,因為我一看題是排序,然后就沒仔細讀題,看了下輸出和輸入就寫碼了,結(jié)果很顯然,有3個點是過不去的,因為這個題還說會出現(xiàn)重復的名字和成績,在map容器當中他的鍵值是不允許重復的,一旦重復,就會發(fā)生覆蓋。然后我就上網(wǎng)學習大佬的,果然有收獲,這種做法,是真的牛逼。哈哈哈哈哈哈哈學到了哈哈哈。
五:記錄失敗的思考結(jié)果
這是我用map做的,有3個點是過不去的。而且是無法修復的,僅此記錄一下。
#include<bits/stdc++.h> using namespace std;int main(){int N,M;map<string,string>m1,m2;map<string,string>:: iterator t;cin >> N >> M;for( int i = 0; i < N; i++ ){string a,b,c;cin >> a >> b >> c;if(M == 1){m1[a] = b;m2[a] = c;}if(M == 2){m1[b] = a;m2[b] = c;}if(M == 3){m1[c] = a;m2[c] = b;}} if( M == 1){for( t = m1.begin(); t != m1.end(); t++ ){cout << t->first << ' ' << t->second <<' '<< m2[t->first] << endl;}}if( M == 2){for( t = m1.begin(); t != m1.end(); t++ ){cout << t->second << ' ' << t->first <<' '<< m2[t->first] << endl;}} if( M == 3 ){for( t = m1.begin(); t != m1.end(); t++ ){cout << t->second << ' ' << m2[t->first] <<' '<< t->first << endl;}} }//3 3 //000007 James 85 //000010 Amy 90 //000001 Zoe 60加油boy! 越努力越幸運!我要敷面膜去了,男孩子也要護膚,也要香香的美美的!
總結(jié)
以上是生活随笔為你收集整理的7-37 模拟EXCEL排序 (25 分)(思路+详解+超时解决 兄弟们冲呀呀呀呀呀呀)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 7-36 社交网络图中结点的“重要性”计
- 下一篇: 华为还是ThinkPad华为还是4G手机