对 n 个同学的考试成绩从大到小排名,成绩相同的算同一名。求排名为 m 的成绩。若无排名为m的成绩,输出最后一名的成绩。
输入格式
一共三行
第一行:一个整数 n,表示同学的个数。
第二行:n 个整数,表示 n 个同学的成绩。
第三行:一个整数 m,表示排名。
输出格式
一个整数,表示排名为 m 的成绩。
数据范围
1 <= n , m <= 1000
输入样例
6
100 100 99 98 97
2
输出样例
99
解释
第一名成绩:100
第二名成绩:99
第三名成绩:98
第四名成绩:97
#include<stdio.h>
#define M 1000
void swap(int *a, int *b);
void gradesort(int g[], int n);
void delDul(int g[], int n);
int main() {
int n,m;
scanf("%d",&n);
int g[n] = {0};
for(int i = 0; i < n; i++) {
scanf("%d",&g[i]);
if(getchar()=='\n'){
break;
}
}
scanf("%d",&m);
gradesort(g, n);
delDul(g, n);
printf("%d",g[m-1]);
return 0;
}
void gradesort(int g[], int n) {
// 冒泡排序
int flag = 0; // 看一下这一趟有没有发生交换
for(int j = 0; j < n; j++) {
for(int i = j; i < n-1; i++) {
if(g[i]<g[i+1]) {
swap(&g[i],&g[i+1]);
flag = 1;
}
}
if(flag == 0) {
break;
}
}
}
void swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
void delDul(int g[], int n) {
for(int i = 0; i < n-1; i++){
if(g[i]==g[i+1]){
for(int j = i; j < n; j++){
g[j] = g[j+1];
}
}
}
}