題目描述
題目大意
題目大意:給出一組學生的准考證號和成績,准考證號包含了考試等級,考場號,日期,和個人編號信息,並有三種查詢方式
查詢一:給出考試等級,找出該等級的考生,按照成績降序,准考證升序排序。
查詢二:給出考場號,統計該考場的考生數量和總得分。
查詢三:給出考試日期,查詢改日期下所有考場的考試人數,按照人數降序,考場號升序排序。
解析
本人花了大概一個小時寫了一段80行的代碼,提交之後還有3個測試點沒有通過…
柳神的代碼可真是太簡潔了~
自己陷入的幾個誤區:
(1)由於題目對時間限制比較嚴格,將字符串類型轉換成整型比較會更高效,但是這樣其實會增加很多麻煩。
(2)爲了方便根據等級、考場號找到對應的考生,分別建立映射表,類型爲map<int, vector < node >
,但是這樣其實會增加很多麻煩。
柳神代碼的幾個優點:
(1)查詢一與查詢三的排序雖然是不同的物理量,但是類型可以一樣,因此只需要使用通用的結構體類型和cmp函數即可。
(2)感覺大神對算法時間複雜度與運行時間及題目時間限制的把握很到位,我拿到這個題的時候認爲這樣先把所有的考生信息存到一個結構體數組之後每次再來查找的算法想來效率應該不高吧,於是就拋棄了這個思路。
AC代碼
#include<iostream>
#include<cstring>
#include<string>
#include<vector>
#include<map>
#include<set>
#include<unordered_set>
#include<unordered_map>
#include<stack>
#include<queue>
#include<cmath>
#include<algorithm>
using namespace std;
struct node {
string s;
int val;
}v[10005];
bool cmp(node &a, node &b) {
return a.val != b.val ? a.val > b.val:a.s < b.s;
}
int main() {
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
int n, m, num; cin >> n >> m;
string s;
for (int i = 0; i < n; i++) {
cin >> v[i].s >> v[i].val;
}
for(int i=1;i<=m;i++) {
int nt=0,ns=0;
vector<node> ans;
cin >> num >> s;
printf("Case %d: %d %s\n", i, num, s.c_str());
if (num == 1) {
for (int j = 0; j < n; j++) {
if (v[j].s[0] == s[0]) ans.push_back(v[j]);
}
}
else if (num == 2) {
for (int j = 0; j < n; j++) {
if (v[j].s.substr(1, 3) == s) {
nt++; ns += v[j].val;
}
}
if(nt>0) printf("%d %d\n", nt, ns);
}
else {
unordered_map<string, int> mapp;
for (int j = 0; j < n; j++) {
if (v[j].s.substr(4, 6) == s) mapp[v[j].s.substr(1,3)]++;
}
for (auto it : mapp) ans.push_back({ it.first,it.second });
}
if ((num == 1 || num == 3) && ans.size() == 0 || num == 2 && nt == 0) printf("NA\n");
else {
sort(ans.begin(), ans.end(), cmp);
for (node it : ans) printf("%s %d\n", it.s.c_str(), it.val);
}
}
return 0;
}
自己的代碼…
日後有時間再來把這段代碼修改一下,先放着。
前前後後兩次用不同的方法做過這個題,都沒能AC…
程序1
#include<iostream>
#include<cstring>
#include<string>
#include<vector>
#include<map>
#include<set>
#include<unordered_set>
#include<unordered_map>
#include<stack>
#include<queue>
#include<cmath>
#include<algorithm>
using namespace std;
struct node {
string id;
int score;
};
struct node1 {
int site, num;
};
bool cmp(node a, node b) {
if (a.score != b.score) return a.score > b.score;
else return a.id < b.id;
}
bool cmp1(node1 a,node1 b){
return a.num != b.num ? a.num > b.num:a.site < b.site;
}
unordered_map<int, vector<node>> Site;
unordered_map<char, vector<node>> Level;
int main() {
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
int n, m; scanf("%d%d", &n, &m);
string s(13,'\0'); int score;
for (int i = 0; i < n; i++) {
scanf("%s %d", s.c_str(), &score);
Level[s[0]].push_back({ s,score });
int site = stoi(s.substr(1, 3));
Site[site].push_back({ s,score });
}
sort(Level['T'].begin(), Level['T'].end(), cmp);
sort(Level['A'].begin(), Level['A'].end(), cmp);
sort(Level['B'].begin(), Level['B'].end(), cmp);
int index;
for(int i=1;i<=m;i++) {
printf("Case %d: ", i);
scanf("%d ", &index);
if (index == 1) {
char c; scanf("%c", &c);
printf("%d %c\n", index, c);
if (Level.count(c) == 0) printf("NA\n");
else for (node it : Level[c]) printf("%s %d\n", it.id.c_str(), it.score);
}
else {
int num; scanf("%d", &num);
if (index == 2) {
printf("%d %03d\n", index, num);
if (Site.count(num) == 0) printf("NA\n");
else {
int sum = 0;
for (node it : Site[num]) sum += it.score;
printf("%d %d\n", Site[num].size(), sum);
}
}
else {
printf("%d %06d\n", index, num);
vector<node1> v;
bool flag = 0;
for (auto it = Site.begin(); it != Site.end(); it++) {
int cnt = 0;
for (node no:it->second) {
if (stoi(no.id.substr(4, 6)) == num) cnt++;
}
if (cnt > 0) {
flag = 1;
v.push_back({ it->first,cnt });
}
}
if (flag == 0) printf("NA\n");
else {
sort(v.begin(), v.end(), cmp1);
for (auto it : v) {
printf("%03d %d\n", it.site, it.num);
}
}
}
}
}
return 0;
}
程序2
#include<iostream>
#include<string>
#include<map>
#include<vector>
#include<algorithm>
using namespace std;
struct stu {
string id;
int score;
}s[10005];
bool cmp(stu &a, stu &b) {
if(a.score!=b.score) return a.score > b.score;
else return a.id < b.id;
}
int n,m;
map<int, int> ma;
void query1(string in) {
vector<stu> an;
for (int i = 0; i < n; i++) {
if (s[i].id.substr(0, 1) == in) {
an.push_back({ s[i].id,s[i].score });
}
}
if (an.size()==0) cout << "NA"<<endl;
else {
sort(an.begin(), an.end(), cmp);
for (auto it = an.begin(); it != an.end(); it++) {
cout << it->id << " " << it->score << endl;
}
}
}
void query2(string in) {
int nt=0, ns=0;
for (int i = 0; i < n; i++) {
if (s[i].id.substr(1, 3) == in) {
nt++;
ns += s[i].score;
}
}
if (nt == 0) cout << "NA"<<endl;
else cout << nt << " " << ns<<endl;
}
void query3(string in) {
map<int, vector<int>> ma2;
for (int i = 0; i < n; i++) {
if (s[i].id.substr(4, 6) == in) {
ma[stoi(s[i].id.substr(1, 3))]++;
}
}
if (ma.size() == 0) cout << "NA" << endl;
else {
for (auto it = ma.begin(); it != ma.end(); it++) {
ma2[it->second].push_back(it->first);
}
for (auto it = ma2.rbegin(); it != ma2.rend(); it++) {
sort(it->second.begin(), it->second.end());
for (int i = 0; i < it->second.size(); i++) {
cout << it->second[i] << " " << it->first<<endl;
}
}
}
}
int main() {
cin >> n >> m;
for (int i = 0; i < n; i++) {
cin >> s[i].id >> s[i].score;
}
for(int i=1;i<=m;i++) {
int q; cin >> q;
string in; cin >> in;
printf("Case %d: %d ", i, q);
cout << in<<endl;
switch (q)
{
case 1:query1(in);
break;
case 2:query2(in);
break;
case 3:query3(in);
break;
}
}
return 0;
}