|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
题目描述
达米奇同学的学校组织信息学竞赛模拟,发现了成绩并列如何排名是个难题。例如有四名选手的成绩分别为 50、80、50、30 分,则 80 分的选手为第一名,50 分的两名选手均为第二名,30 分的选手为第四名。老师请达米奇同学编写一个程序,计算一个选手在这种排名方式之下的名次(分数高的选手排前面)。
输入描述
第一行:一个整数 n
,表示参赛的选手数;
第二行:n
个整数,表示每位选手的成绩,两数之间用一个空格隔开;
第三行:一个整数,表示要查询名次的选手的成绩。
输出描述
一行:一个整数,表示该选手的名次。
- #include<bits/stdc++.h>
- using namespace std;
- int main()
- {
- int n;int a[1000][2];int i,j,k,t,x;
- cin>>n;
- for(i=0;i<n;i++)
- {
- cin>>a[i][0];
- }
- for(i=0;i<n-1;i++)
- {
- for(j=0;j<n-1-i;j++)
- {
- if(a[j][0]<a[j+1][0])
- {
- t=a[j][0];a[j][0]=a[j+1][0];a[j+1][0]=t;
- }
- }
- }
- a[0][1]=1;
- for(i=1;i<n-1;i++)
- {
- if(a[i][0]==a[i-1][0])
- {
- a[i][1]=a[i-1][1];
- }
- else a[i][1]=a[i-1][1]+1;
- }
- cin>>x;
- for(i=0;i<n;i++)
- {
- if(a[i][0]==x){cout<<a[i][1];break;}
- }
- }
复制代码
代码中存在一些问题导致结果错误。首先,数组a的维度定义为[1000][2],但是题目中没有给出选手的数量上限,因此数组的大小应该根据输入的选手数量进行动态分配。其次,在第二个for循环中,循环条件应该是i<n而不是i<n-1,否则会漏掉最后一个选手的排序。最后,在第二个for循环中,判断条件应该是a[ i][0]==a[i+1][0],而不是a[ i][0]==a[i-1][0],因为a[i-1][0]是前一个选手的成绩,而不是当前选手的成绩。
以下是修改后的代码:
- #include<bits/stdc++.h>
- using namespace std;
- int main()
- {
- int n;
- cin>>n;
- int a[n][2];
- for(int i=0;i<n;i++)
- {
- cin>>a[ i][0];
- }
- for(int i=0;i<n-1;i++)
- {
- for(int j=0;j<n-1-i;j++)
- {
- if(a[j][0]<a[j+1][0])
- {
- int t=a[j][0];
- a[j][0]=a[j+1][0];
- a[j+1][0]=t;
- }
- }
- }
- a[0][1]=1;
- for(int i=1;i<n;i++)
- {
- if(a[ i][0]==a[i-1][0])
- {
- a[ i][1]=a[i-1][1];
- }
- else
- {
- a[ i][1]=a[i-1][1]+1;
- }
- }
- int x;
- cin>>x;
- for(int i=0;i<n;i++)
- {
- if(a[ i][0]==x)
- {
- cout<<a[ i][1];
- break;
- }
- }
- }
复制代码
这样修改后的代码应该能够正确计算选手的名次。
|
|