一、题目概述
根据询问的类型和关键字分类统计输出。
类型1:排序输出所有该等级考生名单。按照找成绩降序排序,成绩相同时按照准考证号字典序排序。
类型2:输出该考场考生总数和总分。
类型3:输出该日期各考场的考生总数。
二、思路
1、数据处理
(1)建立结构体node:
struct node
{
char lev;
int site, date, id, score;
};
(2)使用scanf()的格式控制符实现分类录入:
for( int i = 0; i < N; ++i )
scanf("%c%3d%6d%3d %d\n", &L[i].lev, &L[i].site, &L[i].date, &L[i].id, &L[i].score);
特别注意换行符的正确录入。
2、询问类型2当该考场考生为零或考场不存在时输出"NA"。
3、询问类型3不统计考生人数为0的考场, 该日无人考试输出"NA"。
4、注意使用字符串输入询问类型和关键字,并原样输出。
三、代码
#include <cstdio>
#include <iostream>
#include <string>
#include <vector>
#include <map>
#include <algorithm>
using namespace std;
struct node
{
char lev;
int site, date, id, score;
};
int cmp1(node a, node b)
{
if( a.score != b.score )
return a.score > b.score;
else if( a.lev != b.lev )
return a.lev < b.lev;
else if( a.site != b.site )
return a.site < b.site;
else if( a.date != b.date )
return a.date < b.date;
return a.id < b.id;
}
int cmp2( vector<int> a, vector<int> b )
{
if( a[1] != b[1] )
return a[1] > b[1];
return a[0] < b[0];
}
int main()
{
int N, M;
scanf("%d %d\n", &N, &M);
vector<node> rec(N);
for( int i = 0; i < N; ++i )
scanf("%c%3d%6d%3d %d\n", &rec[i].lev, &rec[i].site, &rec[i].date, &rec[i].id, &rec[i].score);
for( int i = 1, type; i <= M; ++i )
{
string query;
getline(cin, query);
printf("Case %d: %s\n", i, query.c_str());
type = query[0] - '0';
if( type == 1 )
{
vector<node> ans;
char term = query[2];
for( int j = 0; j < N; ++j )
if( rec[j].lev == term )
ans.push_back(rec[j]);
sort(ans.begin(), ans.end(), cmp1);
for( int j = 0; j < ans.size(); ++j )
printf("%c%03d%06d%03d %d\n", ans[j].lev, ans[j].site, ans[j].date, ans[j].id, ans[j].score);
if( !ans.size() )
printf("NA\n");
}
else if( type == 2 )
{
int term = atoi(query.substr(2, 3).c_str()), cnt = 0, sum = 0;
for( int j = 0; j < N; ++j )
if( rec[j].site == term )
{
++cnt;
sum += rec[j].score;
}
if( !cnt )
printf("NA\n");
else printf("%d %d\n", cnt, sum);
}
else if( type == 3 )
{
int term = atoi(query.substr(2, 6).c_str());
map<int ,int> cnt;
vector<vector<int>> ans;
for( int j = 0; j < N; ++j )
if( rec[j].date == term )
++cnt[rec[j].site];
for( map<int, int>::iterator it = cnt.begin(); it != cnt.end(); ++it )
ans.push_back({it->first, it->second});
sort(ans.begin(), ans.end(), cmp2);
if( !ans.size() )
printf("NA\n");
for( int j = 0; j < ans.size(); ++j )
printf("%d %d\n", ans[j][0], ans[j][1]);
}
}
}