#include<iostream>
#include<vector>
#include<algorithm>
#include<cstring>
using namespace std;
struct stu//学生准考证结构体
{
string name;
char level;
int posid;
int testday;
int id;
int grade;
};
struct pos//考场结构体
{
int position;
int num;
int date;
pos()
{
position=0;
num=0;
date=0;
}
};
int strtoint(string s)//string转int
{
int i,len=s.length(),num=0;
char c;
for(i=0;i<len;i++)
{
c=s[i]-'0';
num=num*10+c;
}
return num;
}
bool cmp(stu &a,stu &b)//使用引用传参,节省大量时间,类型1的比较函数
{
if(a.grade==b.grade) return a.name<b.name;
else return a.grade>b.grade;
}
bool cmp2(pos &a,pos &b)//类型3的比较函数
{
if(a.num==b.num) return a.position<b.position;
else return b.num<a.num;
}
vector<stu> stulist;//学生数组原本
vector<stu> stulist1;//数学数组复制
pos poslist1[1010];//考场数组
int main()
{
int i,j,m,num,n;
char str[20];
int ordertype,isnone;
stu temp;
vector<stu>::iterator it;
char c;
cin>>n>>m;
c=getchar();
for(i=0;i<n;i++)//学生数组赋值
{
scanf("%s %d",str,&temp.grade);//使用scanf读入,节省时间
num=0;
temp.name=str;
temp.level=str[0];
for(j=1;j<4;j++)
{
c=str[j]-'0';
num=num*10+c;
}
temp.posid=num;
num=0;
for(j=4;j<10;j++)
{
c=str[j]-'0';
num=num*10+c;
}
temp.testday=num;
num=0;
for(j=10;j<13;j++)
{
c=str[j]-'0';
num=num*10+c;
}
temp.id=num;
stulist.push_back(temp);
}
for(j=0;j<m;j++)//处理查询
{
cin>>ordertype>>str;
isnone=1;//查询结果为空标志
stulist1=stulist;//学生数组复制
cout<<"Case "<<j+1<<": "<<ordertype<<" "<<str<<endl;
if(ordertype==1)
{
c=str[0];
sort(stulist1.begin(),stulist1.end(),cmp);//排序
for(it=stulist1.begin();it!=stulist1.end();it++)
{
temp=(*it);
if(temp.level==c)//如果考试类型相同则输出
{
printf("%s %d\n",temp.name.c_str(),temp.grade);
isnone=0;
}
}
if(isnone==1)//查询结果为空
{
cout<<"NA"<<endl;
}
}
else if(ordertype==2)
{
int pos=strtoint(str);
int renshu=0,zongfen=0;
for(it=stulist1.begin();it!=stulist1.end();it++)//遍历
{
temp=(*it);
if(temp.posid==pos)
{
renshu++;
zongfen=zongfen+temp.grade;
isnone=0;
}
}
if(renshu==0)
{
cout<<"NA"<<endl;
}
else//查询结果非空
{
cout<<renshu<<" "<<zongfen<<endl;
}
}
else if(ordertype==3)
{
int date=strtoint(str);
for(i=0;i<1000;i++)//考场数组清空
{
poslist1[i].date=0;
poslist1[i].num=0;
poslist1[i].position=0;
}
for(it=stulist1.begin();it!=stulist1.end();it++)
{
temp=(*it);
if(temp.testday==date)//考场数组复制
{ poslist1[temp.posid].num++;
poslist1[temp.posid].position=temp.posid;
poslist1[temp.posid].date=temp.testday;
}
}
sort(poslist1,poslist1+1000,cmp2);//考场数组排序
for(i=0;i<1000;i++)//考场数组遍历
{
if(poslist1[i].num!=0)
{
printf("%d %d\n",poslist1[i].position,poslist1[i].num);
isnone=0;
}
else
{
break;
}
}
if(isnone==1)
{
cout<<"NA"<<endl;
}
}
else//类型非法
{
cout<<"NA"<<endl;
}
}
return 0;
}
本来感觉挺有思路的。
结果不停报错,写了两个多小时。。。可能是我太菜了吧
写的时候也发现了不少问题
sort的cmp函数使用引用传参可以节省大量时间
使用scanf和printf代替cin和cout以节省时间
printf输出string类型时,需使用string的c_str()函数,printf("%s",str.c_str())
类型非法