PTA 乙级 1095

/终于结束啦啦啦啦啦啦泪奔呜呜呜
我居然在一题这么傻的小模拟卡了接近一年呜呜呜
请自动忽略
/
这题就是纯纯的模拟
对于 1 而言 就是排序
按照等级排序然后按分数非递增 准考证递增排序
初始化一次完成就好啦,
因为等级是字符不好处理,所以俺用了个r()把他们阶级化了…
对于 2 而言 就桶嘛
写个函数把字符转数字好看后
直接人数存入一个桶,分数存一个桶 好结束了…
对于3 呜呜呜 这就是传说中卡我一年的地方
我一直想初始化一次把它解决 也就是用个 字符串 对应 一个数组,那个数组里面存了已经排好的考场,还有一个存了考场人数,可是我菜…突然菜哭
所以我学聪明了,反正数据不大,暴力的线上来就好啦,及直接找用个数组存考场号,一个存考场人数,emmm,再写个排序emmm,结束…靠!
上代码

#include <bits/stdc++.h>
using namespace std;
struct stu{
	string name;      //准考证号 
	int fen,ban,rank; //分数,考场编号,等级 
}sb[10004];
int ren[1005],de[1005];
int w[10005],ge[1005];
int r(char c) //得阶级斗争 
{
	if(c == 'T') return 3;
	if(c == 'A') return 2;
	if(c == 'B') return 1;
}
int db(string s) //得考场编号 
{
	int point = 0;
	for (int i = 0; i < 3; i++)
	{
		point = point*10+s[i]-'0';
	} 
	return point; 
}
int comp(stu a,stu b)
{
	if(a.rank == b.rank)
	{
		if(a.fen == b.fen) return a.name < b.name; //准考小优先 
		return a.fen > b.fen; //分高优先 
	} 
	return a.rank > b.rank ; // 阶级高优先 
} 
int comp2(int a,int b)
{
	if(ge[a] == ge[b]) return a < b; //人同班级编号小优先 
	return ge[a] > ge[b];  //人多优先 
} 
int main()
{
	int n,t;  string s;
	scanf("%d%d",&n,&t);
	for (int i = 0; i < n; i++)
	{
		cin>>s;  int b = db(s.substr(1,3));//得到考场号
		//printf("%d\n",b); 
		scanf("%d",&sb[i].fen);
		sb[i].name = s;
		sb[i].rank = r(s[0]); 
		sb[i].ban = b;
		ren[b]++; de[b] += sb[i].fen;
	}
	//初始化
	sort(sb,sb+n,comp);//按等级排序 
	for (int i = 1; i <= t; i++)
	{
		int what,b,ok = 0;  char c;
		scanf("%d",&what);
		if(what == 1)
		{
			scanf(" %c",&c);
			printf("Case %d: 1 %c\n",i,c);
			for (int j = 0; j < n; j++)
			{
				if(sb[j].name[0] == c)
				{ 
					ok  = 1;
					cout<<sb[j].name<<" "<<sb[j].fen<<endl;
				}
			}
			if(!ok) printf("NA\n");
		}
		else if(what == 2)
		{
			scanf("%d",&b);
			printf("Case %d: 2 %d\n",i,b);
			if(!ren[b]) printf("NA\n");
			else 		printf("%d %d\n",ren[b],de[b]);
		}
		else
		{
			int ws = 0;
			memset(w,0,sizeof(w));   
			memset(ge,0,sizeof(ge)); //记得初始化 
			cin >> s;
			printf("Case %d: 3 ",i); cout<<s<<endl;
			for (int j = 0; j < n; j++)
			{
				if(sb[j].name.substr(4,6) == s)
				{
					if(!ge[sb[j].ban])
					{
						w[ws++] = sb[j].ban;
					}
					ge[sb[j].ban]++;
				}
			} 
			if(!ws) printf("NA\n");
			else
			{
				sort (w,w+ws,comp2);
				for (int j = 0; j < ws; j++)
				{
					printf("%d %d\n",w[j],ge[w[j]]);
				}
			}
		}
	}
	return 0;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值