CF_2A_Winner

题目本意是一个游戏:n个轮回,其中每个轮回格式:name score,表示玩家及相应的得失分数,输出最后赢家,若最后一轮过后,点数最高的不止一个,则输出这些点数相同的人中最先达到最大点数的那个人的姓名。

代码如下:共n论输入,每次输入判断人名是否存在,若存在只需进行count[j]的更新;否则不许先将人名字符串先复制到name数组中,每次更新完毕后将记录每个人,每轮点数的r[j][i]数组进行值得更新.

n轮结束后,找出第n轮点数最多的,即count数组的最大值,并记录下标,然后判断是否有多个最大值,没有直接将最大值下标k对应的人名name[k]输出;否则对所有轮回进行判断,在均有最大值的人中寻找最先达到最大值得人名并输出。

#include<stdio.h>
#include<string.h>
#define SIZE 35
#define N 1100
char name[N][SIZE];
int count[N],r[N][N];
int main(void)
{
    int n;
    int i,j,k,max=0,ct=0;
    int poi;
    char s[SIZE];
    scanf("%d",&n);
    for(i=0; i<n; i++)
    {
        scanf("%s%d",s,&poi);
        for(j=0; j<ct; j++)
            if(strcmp(name[j],s)==0)//判断是否已经存在该玩家
            {
                count[j]+=poi;
                break;
            }
        if(j==ct)
        {
            strcpy(name[ct],s);//将玩家名存入name数组
            count[ct++]+=poi;
        }
        for(j=0; j<ct; j++)//对前ct名玩家的第i轮点数进行更新
            r[j][i]=count[j];
    }
    for(i=0; i<ct; i++)
        if(count[i]>max)
        {
            max=count[i];//找到最后一轮点数最大值,并记录下标
            k=i;
        }
    int flag=0;
    for(i=0; i<ct; i++)
        if(count[i]==count[k]&&i!=k)//找到第n轮中同样具有max点数的其他玩家
        {
            for(i=0; i<n; i++)
              {
                 for(j=0; j<ct; j++)//对前ct玩家的前n轮进行遍历,查找最先超过max点数的玩家
                    if(count[j]==count[k]&&r[j][i]>=count[k])//超过max点数,同样第n轮具有max点数的玩家
                    {
                        k=j;
                        flag=1;
                        break;
                    }
                    if(flag)
                        break;
              }
        break;
        }
    printf("%s\n",name[k]);
    return 0;
}

 

posted on 2013-05-15 23:47  rootial  阅读(153)  评论(0编辑  收藏  举报

导航