题目链接
题目描述
小红正在参加校招笔试,现在给出了小红的分数、总人数以及其他人的分数,已知校招的过线率是50%(向下取整),小红想知道她最终是否能过线?
注:如果有多个人和恰好过线的分数相同,那么这些人会同时过线。
输入:
- 第一行输入一个正整数
,表示总人数
- 第二行输入
个整数,用空格隔开,第一个数是小红的分数,其他是其他人的分数
输出:
- 如果小红过线了,输出"Yes",否则输出"No"
解题思路
这是一个排序问题,可以通过以下步骤解决:
-
关键发现:
- 过线人数是总人数的一半(向下取整)
- 过线分数是排序后第 n/2 个位置的分数
- 如果有多个人和过线分数相同,都会过线
-
解题策略:
- 记录小红的分数
- 对所有分数排序
- 找到过线分数
- 判断小红分数是否大于等于过线分数
-
具体步骤:
- 保存小红的分数
- 对所有分数从大到小排序
- 计算过线人数:n/2(向下取整)
- 判断小红分数是否大于等于过线分数
代码
#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
cin >> n;
vector<int> scores(n);
for(int i = 0; i < n; i++) {
cin >> scores[i];
}
int xiaohong = scores[0]; // 保存小红的分数
sort(scores.begin(), scores.end(), greater<int>()); // 从大到小排序
int pass_line = scores[(n-2)/2]; // 过线分数
cout << (xiaohong >= pass_line ? "Yes" : "No") << endl;
return 0;
}
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
Integer[] scores = new Integer[n];
for(int i = 0; i < n; i++) {
scores[i] = sc.nextInt();
}
int xiaohong = scores[0]; // 保存小红的分数
Arrays.sort(scores, Collections.reverseOrder()); // 从大到小排序
int pass_line = scores[(n-2)/2]; // 过线分数
System.out.println(xiaohong >= pass_line ? "Yes" : "No");
}
}
n = int(input())
scores = list(map(int, input().split()))
xiaohong = scores[0] # 保存小红的分数
scores.sort(reverse=True) # 从大到小排序
pass_line = scores[(n-2)//2] # 过线分数
print("Yes" if xiaohong >= pass_line else "No")
算法及复杂度
- 算法:排序
- 时间复杂度:
- 主要是排序的时间复杂度
- 空间复杂度:
- 需要存储所有分数