题目本意是一个游戏: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; }