(字符串\MAP)PTA BASIC LEVEL 1080 MOOC期终成绩

补充知识

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;	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值