话不多说,直奔主题。
1.要解决同一个人不同场比赛的得分与名次累计;
2.要解决两种排名方式所对应的排序方法;(sort函数与cmp定义相配合)
题中可得
第一场:apple 25; banana 18 ; pear 15
第二场:pear 25; banana 18
第三场:apple 25; banana 18
总计:
apple 50 banana 54 pear 40
apple : 第一2
banana: 第二3
pear: 第一1,第三1
第一种排序(先看分数,再看排名): banana; apple; pear
第二种排序(先看排名,再看分数): apple; pear; banana
#include <bits/stdc++.h>
#define N 200
using namespace std;
int score[11]={0,25,18,15,12,10,8,6,4,2,1}; //分数的顺序
typedef struct info
{
char name[51]; //名字
int mark; //对应名次的分数
int pos; //对应的名次
int num[30]; //名次为第n的次数
}info;
info loc[N];
int h;
int cmp(info a, info b) //第一种排名方式 (降序)
{
int i=1;
if(a.mark==b.mark) return a.num[i]>b.num[i]; //先看分数,再看排名
else return a.mark>b.mark;
if (a.mark==b.mark && a.num==b.num)
{
i++;
cmp(a,b);
}
}
int comp(info a, info b) //第二种排名方式 (降序)
{
int i=1;
if (a.num[i]==b.num[i]) return a.mark>b.mark; //先看排名,再看分数
else return a.num[i]>b.num[i];
if (a.mark==b.mark && a.num[i]==b.num[i]) //均相同时,采用第一种方案
{
i++;
cmp(a,b);
}
}
int main(int argc, char** argv)
{
memset(loc,0,sizeof(loc)); //清零
int t,n,j,k; cin>>t; h=1;
int max=0,x;
for (int i=1; i<=t; i++) //输入选手信息,初始化
{
cin>>n;
for (k=1; k<=n; k++)
{
cin>>loc[h].name;
loc[h].mark=score[k];
loc[h].pos=k;
loc[h].num[k]=0;
if (loc[h].pos==k) loc[h].num[k]++;
h++;
}
}
h-=1;
for (int i=1; i<h; i++)
for (j=i+1; j<=h; j++)
{
if (strcmp(loc[i].name, loc[j].name)==0) //同一个人
{
loc[i].mark+=loc[j].mark; //成绩相加
for (int l=1; l<=h; l++)
loc[i].num[l]+=loc[j].num[l]; //所得名次的次数相加
}
}
sort(loc+1, loc+h, cmp);
cout<<endl;
cout<<loc[1].name<<endl; //第一种排序最高
sort(loc+1, loc+h, comp);
cout<<loc[1].name<<endl; //第二种排序最高
return 0;
}
运行结果