CodeForces 2A - Winner(STL)

本文介绍了一种用于判断Berlogging卡牌游戏胜负的算法,通过跟踪玩家得分变化,确定最终胜者。若多个玩家得分相同,算法识别最先达到最高分的玩家。使用map和数组高效处理大量玩家数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在 Berland,卡牌游戏“Berlogging”的赢家由以下的规则决定。如果在游戏结束时,仅有一位玩家拥有最多的得分,那么他就是赢家。如果这样的玩家数量超过了一个人,则情况变得有些困难。在每个回合中,某个玩家赢得或输掉特定的得分。在游戏进行之时,得分被登记于“姓名 得分”行中,其中 姓名 是指该玩家的姓名,得分 是指此回合中的得分 (得分是整数)。如果得分是负数,这就意味着该玩家输掉了此回合。因此,在游戏结束时,如果两个或更多的玩家拥有最大的得分 (比如等于 m),那么首先获得至少 m 得分的玩家为赢家。初始状态下,每个玩家的得分均为 0 。数据保证:在游戏结束时,至少有一位玩家拥有正的得分。

输入

第一行包含了一个整数 n (1  ≤  n  ≤  1000),其中 n 表示游戏的回合数。接下来是 n 行,包含了以时间顺序排列的各回合中的“姓名 得分”信息,其中 姓名 是长度介于 1 到 32 之间的由小写拉丁字母所构成的字符串,且 得分 是介于 -1000 到 1000 闭区间内的整数。

输出

打印赢家的姓名。

示例

输入

3
mike 3
andrew 5
mike 2

输出

andrew

输入

3
andrew 3
andrew 2
mike 5

输出

andrew

题意是几个人回合战,每回合都会得分(人会重复出现),一直到最后,如果只有一个人的分数最高,那就输出他的名字。如果最高分不是一个人,那就输出第一个到达这个最高分的人(一开始就没有看到这句话),直接WA。代码:

#include <cstdio>
#include <iostream>
#include <map>
using namespace std;
map<string, int> a,b;
string s[1017];
int main()
{
    int x[1017];
    int n;
    cin >> n;
    for(int i = 1; i <= n; i++)
    {
        cin >> s[i] >> x[i];
        a[s[i]]+=x[i];
    }
    int maxx = 0;
    for(int i = 1; i <= n; i++)
    {
        if(a[s[i]] > maxx)
            maxx = a[s[i]];
    }
    for(int i = 1; i <= n; i++)
    {
        b[s[i]]+=x[i];
       if((b[s[i]]>=maxx)&&(a[s[i]]>=maxx))
        {
            cout << s[i];
            break;
        }
    }
    return 0;
}

使用map,string 数组,普通数组,巧妙地将数据保存下来,并且名字与得分之间的关系也保存下来,思路比较清晰。先将数据及对应关系保存下来(也包括最终得分,这个数据保存在map<string,int>中),然后遍历最后得分,得到最大值。然后最好再将一开始保存的数据重新加和一遍(为了得到第一个大于或者等于最大的分的这个人)。

if((b[s[i]]>=maxx)&&(a[s[i]]>=maxx))
        {
            cout << s[i];
            break;
        }

if 条件语句保证当前得到最大值的人在游戏结束后也是最大值的人之一(题目要求)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值