这题,读懂题是关键。
题意:找到最终结果时分数是最大的,当有多个时,找到值最先大于等于最大值的人
过程:模拟俩次过程,第一次求最大值,第二次求最先到达者。
我写了两个代码,均带有注释,第一个是不用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;}
}
//第二张地图找到最先出现的大于等于最大值的数,并且最后的这个值是等于最大的
//如果不注意后面的数会变小 就会案例过不掉,因为有一些值后来会不是最大的
}
}