先看题、最后面讲地図
李明はいい学生です。彼は毎回の試験の後にクラスでの自分のランクについて常に先生に尋ねます、それは先生を非常に疲れさせます。そこで、先生はクラスの生徒全員のスコアを教えて、自分でランクを取得するように依頼しました。しかし、同級生が多く、自分のランクがわかりにくい。それで彼はあなたに助けを求める傾向があります、あなたは彼を助けることができますか?
入力入力
の最初の行には、Li Mingのクラスの生徒数を表す整数N(1 <= N <= 10000)が含まれています。次に、N行が来ます。各行には、30文字以内の名前が含まれています。これらの名前はLiMingのクラスのすべての生徒を表しており、名前は互いに異なっていると推測できます。
(N + 2)行目には、試験の数を表す整数M(1 <= M <= 50)が表示されます。次のMパーツは、それぞれ試験を表しています。各試験にはN行あります。各行には、100以下の正の整数Sと、上記の名前リストに含まれている必要のある名前Pがあります。これは、この試験で学生PがSスコアを獲得することを意味します。名前リストのすべての名前が試験に表示されることが確認されています。
出力
出力にはM行が含まれます。i番目の行では、i番目の試験の後にLiMingのランクを指定する必要があります。ランクは合計スコアによって決定されます。Li Mingが他の人と同じスコアを持っている場合、彼は常にランクリストで他の人の前にいます。
サンプル入力
3
李明
A
B
2
49李明
49 A
48 B
80 A
85 B
#include<stdio.h>
#include<string.h>
#include <iostream>
#include <map>
using namespace std;
map <string,int> x;//定义一个以字符串为下标,int类型的值
int main()
{
int n,m,i,sum;
char s[10100][50],a[10010];
char s1[101]="Li Ming";//匹配liming
scanf("%d ",&n);
for(i=0;i<n;i++)
{
gets(s[i]);
x[s[i]]=0; //初始化值
}
scanf("%d",&m);
int f,c;
while(m--)
{
c=1;
for(i=0;i<n;i++)
{
scanf("%d ",&sum);//成绩
gets(s[i]);//姓名
x[s[i]]+=sum;//对应的姓名+上成绩,注意题目是成绩总分
//从姓名映射到数字
if(strcmp(s[i],s1)==0)//匹配liming
f=x[s[i]];//标记liming的分数
}
for(i=0;i<n;i++)
if(x[s[i]]>f)//与标记的liming的总分比较
c++;
printf("%d\n",c);
}
}
マップリンク:マップの使用法と理解。