题目描述 在我们参加的各种竞赛中,允许并列的排名方式是经常遇到的。 例如有四名选手的成绩分别为50、80、50、30分,则80分的选手为第一名,50分的两名选手均为第二名,30分的选手为第四名。 请编写一个程序,计算每个选手在这种排名方式之下的名次(分数高的选手排前面)。
输入格式 第一行为一个整数n,表示参赛的选手数,1<=n<=1000 ,第二行为n个整数,表示每位选手的成绩。
输出格式 一行,表示每位选手的名次
#include<cstdio>
using namespace std;
int a[1005],b[1005],c[1005];
int swap(int &a,int &b)
{
a^=b^=a^=b;
return a,b;
}
int main()
{
int n,u=0,o;
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]),b[i]=i;
for(int i=1;i<n;i++)
{
for(int j=1;j<n;j++)
{
if(a[j]<a[j+1]) swap(a[j],a[j+1]),swap(b[j],b[j+1]);
}
}
for(int i=1;i<=n;i++)
{
if(a[i]==a[i-1]) c[i]=o,u++;
else u++,o=u,c[i]=o;
}
for(int i=1;i<n;i++)
{
for(int j=1;j<n;j++)
{
if(b[j]>b[j+1]) swap(b[j],b[j+1]),swap(c[j],c[j+1]);
}
}
for(int i=1;i<=n;i++) printf("%d ",c[i]);
return 0;
}