F1赛车比赛排名问题(oj)

在这里插入图片描述
话不多说,直奔主题。
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; 
}

运行结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值