CF2A Winner 字符串乱搞

题目:
题目原网址
洛谷题目网址

大意:
在每一轮中,玩家获得或失去一定数量的分数,在游戏过程中,分数被记录在“名称和得分”行中,其中名字是玩家的名字,得分是在这一轮中获得的分数。得分是负值意味着玩家失去了相应的分数。如果在比赛结束时只有一名玩家分数最多,他就是获胜者。如果两名或两名以上的玩家在比赛结束时都有最大的分数 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]);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值