/终于结束啦啦啦啦啦啦泪奔呜呜呜
我居然在一题这么傻的小模拟卡了接近一年呜呜呜
请自动忽略/
这题就是纯纯的模拟
对于 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;
}