题目描述
题目大意
题目大意:给出一组学生的准考证号和成绩,准考证号包含了考试等级,考场号,日期,和个人编号信息,并有三种查询方式
查询一:给出考试等级,找出该等级的考生,按照成绩降序,准考证升序排序。
查询二:给出考场号,统计该考场的考生数量和总得分。
查询三:给出考试日期,查询改日期下所有考场的考试人数,按照人数降序,考场号升序排序。
解析
本人花了大概一个小时写了一段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;
}