题解 CF2A 【Winner】

这是一道不错的map映射练手题。
但是我觉得楼下几位讲解map都讲解的不是非常的具体,所以我决定来补充一下,能让没学过map的同学初步认识map。

map:映射,故名思议,就是一种类型对应另外一种类型。比如,小明考试考了100分,那么名字“小明”所对应的“分数”100分,就是一种映射。

// 定义方法
map<类型1,类型2> 变量名

其中,变量2就被称为变量1的映射。那么如何使用呢?很简单。例如,我们让string“XiaoMing”所对应的int类型进行+1操作。

string s="XiaoMing";
map[s]++;

好了,如果看完了上面,你就基本上能使用map映射了。

那么我们言归正传,来讲这道题:

我们先定义string对应int的map映射。对每次输入进来的人名进行对应的分数操作。
但是,有可能会出现比赛结束后最大分相等的情况。所以我们就要结束之后再访问一遍,查找第一次大于等于最大分的情况。
其他需要注意的地方这道题似乎就没有了。剩下的就是最基础的调用map。

话不多说,看代码

#include
#define MAXN 1010  
using namespace std;
int n,i,j,x,maxn=-1000,sc[MAXN]; //设置最大值一开始为题目保证不会出现的数据
string s,maxs,stu[MAXN];
map<string,int> m,m1; //m记录的为最后的状态,m的作用用来查找最大分数。
// m1的作用是统计完最大值后,重新进行操作,找到第一次至少达到最大值的人并且这个人最后的分数为最大值。
int main(){
    scanf("%d",&n);
    for(i=1;i<=n;i++){
        cin >> stu[i] >> sc[i];
        m[stu[i]]+=sc[i];//根据输入的分数进行操作。
    }
    for(i=1;i<=n;i++) maxn=max(maxn,m[stu[i]]); //找到最大值
    for(i=1;i<=n;i++){
        m1[stu[i]]+=sc[i];//重新进行统计
        if(m[stu[i]]==maxn&&m1[stu[i]]>=maxn){ //若结束后这个人的分数为最大值且当前分数已经达到了最大值        
            maxs=stu[i]; //记录这个人的名字
            break;//退出循环
        } 
    }
    cout << maxs << endl; //输出
}

你可能感兴趣的:(题解 CF2A 【Winner】)