【问题描述】
在选美大奖赛的半决赛现场,有n名选手(2<n<100)参加比赛。比赛结束时,要在现场按照选手的出场顺序宣布最后名次,获得相同分数的选手具有相同的名次,名次连续编号,不用考虑同名次的选手人数。如:
选手数量: 7
选手得分: 5,3,4,7,3,5,6
宣布名次: 3,5,4,1,5,3,2
请编程帮助大奖赛组委会完成半决赛的评分排名工作。
【输入形式】
选手数量:7
选手得分:5 3 4 7 3 5 6
【输出形式】
选手的排名:3 5 4 1 5 3 2
【样例输入】
7 5 3 4 7 3 5 6 【样例输出】
3 5 4 1 5 3 2 【样例说明】
本题的关键在于如何处理同分数的选手排名问题 我一开始想用数组,但是因为懒,直接用sort 排序后就会把分数与排名对应关系分离,所以用结构体好一些,至少省事多了
#include<iostream> #include<cmath> #include<bits/stdc++.h> using namespace std; struct M{ //结构体,a记录得分 ,b记录排名 int a; int b; }; bool cmp(M n,M m)//得分降序排列 { return n.a>m.a; } struct C{ //复制得分 原来的顺序 int a; }; int main(){ int n;cin>>n; M p[n]; C q[n]; for(int i=0;i<n;i++){ cin>>p[i].a; p[i].b=0; q[i].a=p[i].a; } sort(p,p+n,cmp); p[0].b=1; for(int i=1;i<n;i++){ if(p[i].a==p[i-1].a) p[i].b=p[i-1].b; else p[i].b=p[i-1].b+1; } for(int i=0;i<n;i++){//按原顺序输出对应名次 for(int j=0;j<n;j++){ if(q[i].a==p[j].a) { cout<<p[j].b<<" ";break; } } } } // int a[n],b[n],c[n]={0}; // for(int i=0;i<n;i++){ // cin>>a[i]; // b[i]=a[i]; // } // sort(a,a+n,cmp); // for(int i=0;i<n;i++){ // for(int j=0;j<n;j++){ // if(b[i]==a[j]&&a[j-1]==a[j]&&j>=1){ // c[i]=c[j];break; // } // if(b[i]==a[j]&&a[j-1]!=a[j]&&j>=1) // { // c[i]=c[j]+1;break; // } // if(b[i]==a[j]&&j==0){ // c[i]=j+1;break; // } // // }} // for(int i=0;i<n;i++) // cout<<c[i]<<" ";