话不多说,直奔主题。
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;
}
运行结果