您的位置:首页 > 其它

Codeforces 2A - Winner模拟题

2018-03-01 18:57 453 查看
这题,读懂题是关键。
题意:找到最终结果时分数是最大的,当有多个时,找到值最先大于等于最大值的人
过程:模拟俩次过程,第一次求最大值,第二次求最先到达者。
我写了两个代码,均带有注释,第一个是不用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;}
        }
        //第二张地图找到最先出现的大于等于最大值的数,并且最后的这个值是等于最大的
//如果不注意后面的数会变小 就会案例过不掉,因为有一些值后来会不是最大的 
    }
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  codeforces题解