大意:
在每一轮中,玩家获得或失去一定数量的分数,在游戏过程中,分数被记录在“名称和得分”行中,其中名字是玩家的名字,得分是在这一轮中获得的分数。得分是负值意味着玩家失去了相应的分数。如果在比赛结束时只有一名玩家分数最多,他就是获胜者。如果两名或两名以上的玩家在比赛结束时都有最大的分数 m,那么其中首先获得至少 m 分的玩家胜利。开始时,每个玩家都是0分。保证在比赛结束时至少有一个玩家的分数为正。(by 洛谷)
分析:根据题目意思,只能有一个人获胜,记录每个人得分数变化过程,再暴力判断即可。又是一个字符串题,用来练一练。还有就是c++好像不能直接判断两个字符串是否一样(是这样吗?),最后只能暴力判断了= =
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
int n,i,j,len,c,x,num,q,k,l,u,v;
char s[101],t[101];
char a[1001][101];
int g[1001][1001];
int ls[1001],next[1001][1001];
int main()
{
scanf("%d",&n);
for (i=1;i<=n;i++)
{
scanf("%s",t);
scanf("%s",s);
len=strlen(t);
c=1; j=0;
if (s[0]=='-')
{
c=-1;
j=1;
}
x=0;
while (j<strlen(s))
{
x=x*10+s[j]-'0';
j++;
}
x=x*c; q=0;
for (k=1;k<=num;k++)
{
int len1=strlen(t);
int len2=strlen(a[k]);
if (len1==len2)
{
int flag=0;
for (l=0;l<len1;l++)
{
if (t[l]!=a[k][l])
{
flag=1;
break;
}
}
if (flag==0)
{
g[k][i]=g[k][ls[k]]+x;
next[k][ls[k]]=i;
ls[k]=i;
q=1;
}
}
}
if (q==0)
{
num++;
for (j=0;j<len;j++)
a[num][j]=t[j];
g[num][i]=x;
next[num][0]=i;
ls[num]=i;
}
}
int ans=-0x3f3f3f3f;
int at=0;
for (j=1;j<=num;j++)
{
if (g[j][ls[j]]>ans)
{
ans=g[j][ls[j]];
at=j;
}
else
{
if (g[j][ls[j]]==ans)
{
int a1=next[at][0];
while (a1!=0)
{
if (g[at][a1]>=ans)
{
u=a1;
break;
}
a1=next[at][a1];
}
int a2=next[j][0];
while (a2!=0)
{
if (g[j][a2]>=ans)
{
v=a2;
break;
}
a2=next[j][a2];
}
if (u>v)
{
at=j;
}
}
}
}
printf("%s",a[at]);
}