水题,竟然花了那么多时间。。。主要是不知道为什么,明明在本机上编译过去了,但是用c++提交却编译错误。。。最后用g++提交AC
题意:给出n个学生的名字,然后给出m个测验。
每个测验给出n个学生的分数。
当给出第i次测验的成绩,求Li Ming在所有学生中,前i次成绩总和的排名(若分数相同,则Li Ming排在第一个)
开始没仔细看题,以为对于每次测验,只要给出Li Ming在此次测验中的排名。
后来才知道,原来题目中有这么一句话:
In the i-th line, you should give the rank of Li Ming after the i-th exam.
The rank is decided by the total scores。。。
思路:用map建立映射关系,最后求名次的时候for循环一遍即可。
#include <iostream>
#include <stdio.h>
#include <map>
#include <string.h>
#include <algorithm> const int maxn=;
using namespace std;
int n,m;
int score[maxn];
map<string,int> stu; //建立学生名字到编号的映射 int main()
{
char str[];
int fenshu;
cin>>n;
getchar();
for(int i=;i<=n;i++){
gets(str); //用gets读取名字
stu[str]=i;
}
cin>>m;
memset(score,,sizeof(score));
while(m--){
for(int i=;i<=n;i++){
scanf("%d",&fenshu);
getchar(); //先读取分数后面的一个空格
gets(str);
score[stu[str]]+=fenshu;
}
int ranks=; //李明的排名
for(int i=;i<=n;i++)
if(score[i]>score[stu["Li Ming"]])
ranks++;
cout<<ranks<<endl;
}
return ;
}