Codeforces 2A - Winner模拟题

这题,读懂题是关键。

题意:找到最终结果时分数是最大的,当有多个时,找到值最先大于等于最大值的人

过程:模拟俩次过程,第一次求最大值,第二次求最先到达者。

我写了两个代码,均带有注释,第一个是不用map函数的直接模拟的适合初学者阅读,另外一个是用map函数的短小精炼 在第一个代码后面。      

AC代码:

#include<bits/stdc++.h>

using namespace std;
struct namea{
char name[33];
int num;
int ans;
}A[1001],B[1001];
int num[1001];
int main()
{ //大数组,先存下来。
//每访问一次 每个人检索一轮下来 找之前是否出现过没出现+1 出现加值 
//找到了最大值

//从头开始检索 找到最先出现的
//复杂度(1000+1)*500  
int t,i,j;

scanf("%d",&t);

for(i=1;i<=t;i++)
scanf("%s%d",B[i].name,&B[i].num);
int x=1;
for(i=1;i<=t;i++)A[i].num=0;
for(i=1;i<=t;i++)
{
for(j=1;j<=i;j++)
{
if(strcmp(B[i].name,A[j].name)==0)break;
}
if(j>i)//未出现过 
{
strcpy(A[x].name,B[i].name);
A[x].num+=B[i].num;x++;
}
else //出现过了
{
A[j].num+=B[i].num;
}
}
int max=0;
for(i=1;i<=x;i++)if(max<A[i].num)max=A[i].num;
bool flag=0;
for(i=1;i<=t;i++)
{
for(j=1;j<=x;j++)
{
if(strcmp(B[i].name,A[j].name)==0)
{
A[j].ans+=B[i].num;
if(A[j].ans>=max&&A[j].num==max)flag=1;
break;
}
}
if(flag)break;
}
printf("%s\n",A[j].name);

}

使用map函数的 AC代码:

#include<bits/stdc++.h>
using namespace std;
char a[1010][55];  
int n[2005],m,maxi; 
int main()  
{  
    map<string,int>map1,map2;  
scanf("%d",&m);  
    {
        maxi=-1000;  
        for(int i=0;i<m;++i)scanf("%s%d",a[i],&n[i]),map1[a[i]]+=n[i];
        //加入map1 名字和值 
for(int i=0;i<m;++i)if(map1[a[i]]>maxi)maxi=map1[a[i]];
        //map1里的那个人的名字就有这个这个值 进行比较即可,找到最大值 
for(int i=0;i<m;++i)  
        {
            map2[a[i]]+=n[i];
            if(map2[a[i]]>=maxi&&map1[a[i]]==maxi){printf("%s\n",a[i]);break;}
        }
        //第二张地图找到最先出现的大于等于最大值的数,并且最后的这个值是等于最大的
//如果不注意后面的数会变小 就会案例过不掉,因为有一些值后来会不是最大的 
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值