补充知识
1、如何判断map类插入是否成功
当map的键是第一次存入时,它对应的初值是值类的默认值(int就是0)
map<string,int> roll;//map里的元素类型是pair<T1,T2>类型
string temp;int tem;
if(roll[temp]==0)//判断temp键是否是第一次插入
count++;
2、可以利用map类来实行“花名册”功能,以减少时间复杂度
如果学号为一个整数的时候,我们可以构建一个超出学号范围的数组,然后将数组下标作为学号,来直接进行索引。
但学号如果是一个具有字母和数字的字符串的时候,就要通过map先将字符串和数字连接,这样就可以直接使用map[roll[name]]来进行索引,减少时间复杂度
map<string ,int> roll;
string temp;int tem;
int count=0;//迭代器
cin>>temp>>tem;
roll[temp]=count++;
解题思路:
先建立一个很大很大的结构体学生数组,并将所有元素的各个子元素的初值设为-1。
通过map建立学号与结构体学生数组下标的花名册,让数组中的元素与学号一一对应。
然后分别对数组进行三次不同的输入操作,期间按照补充知识1进行调整。
坑点:最后一个测试点的测试用例很大,数组大小要再大一点
解答:
#include<iostream>
#include<string>
#include<vector>
#include<map>
#include<algorithm>
using namespace std;
map<string,int > roll;
struct stud{
int gp;int gmid;int gfin;int g;string no;
};
bool cmp(stud s1,stud s2)
{
if(s1.g!=s2.g)
return s1.g>s2.g;
else return s1.no<s2.no;
}
int main()
{
int p,n,m;
cin>>p>>n>>m;
stud stu[10005];
for(int i=0;i<10005;i++)
stu[i].gp=stu[i].gmid=stu[i].gfin=stu[i].g=-1;
int count=1;
string temp;int tem;
for(int i=0;i<p;i++)
{
cin>>temp>>tem;
roll[temp]=count++;
stu[roll[temp]].no=temp;
stu[roll[temp]].gp=tem;
}
for(int i=0;i<n;i++)
{
cin>>temp>>tem;
if(roll[temp]==0)
{
roll[temp]=count++;
stu[roll[temp]].no=temp;
}
stu[roll[temp]].gmid=tem;
}
for(int i=0;i<m;i++)
{
cin>>temp>>tem;
if(roll[temp]==0)
{
roll[temp]=count++;
stu[roll[temp]].no=temp;
}
stu[roll[temp]].gfin=tem;
}
for(int i=0;i<count;i++)
{
if(stu[i].gmid>stu[i].gfin)
stu[i].g=0.4*stu[i].gmid+0.6*stu[i].gfin+0.5;
else stu[i].g=stu[i].gfin;
}
sort(stu,stu+count,cmp);
for(int i=0;i<count;i++)
if(stu[i].gp>=200&&stu[i].g>=60)
cout<<stu[i].no<<" "<<stu[i].gp<<" "<<stu[i].gmid
<<" "<<stu[i].gfin<<" "<<stu[i].g<<endl;
}