PAT A 1153 Decode Registration Card of PAT (25 分)

一、题目概述

根据询问的类型和关键字分类统计输出。
类型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]);
		}
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值