【问题描述】传闻有一位肖教官的要求非常严格,因此士兵们都叫他魔鬼教官。肖教官在组建队伍的时候,只会保留能力值最高的那些士兵。每当一名新的战士入伍的时候,他会勒令队伍中所有能力值小于新战士的能力值的战士都退伍。已知某天一共入伍了 n 名士兵,第 i 名士兵的能力值为 a i ,且一开始队伍中没有任何士兵。请问在经过肖教官的灵魂拷问之后,有哪些士兵留在了队伍中。 【输入形式】第一行一个正整数 n ,属于区间 [1,1000] ,不需要对其是否满足该条件进行额外的判断。 第 2 行至第 n+1 行为一个正整数,其中第 i+1 行为 a i ,属于区间 [1,100000] ,不需要对其是否满足该条件进行额外的判断。 【输出形式】第一行一个整数 m ,表示最后留在队伍中的人数。 接下来 m 行,每行一个整数,表示一名最后留在队伍中的士兵的编号,按编号从小到大的顺序输出。
时间: 2024-02-25 09:55:41 浏览: 126
教官自我介绍简历模板
好的,这是一道经典的选择排序题目。先来看一下代码实现:
```
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
int a[n];
for(int i = 0; i < n; i++) {
cin >> a[i];
for(int j = i; j > 0; j--) {
if(a[j] > a[j-1]) {
swap(a[j], a[j-1]);
} else {
break;
}
}
}
int cnt = 0;
for(int i = 0; i < n; i++) {
if(a[i] == a[0]) {
cnt++;
} else {
break;
}
}
cout << cnt << endl;
for(int i = 0; i < cnt; i++) {
cout << i+1 << endl;
}
return 0;
}
```
其中,第一个 for 循环用来输入每个士兵的能力值,并将其按照从大到小的顺序插入到一个数组中。第二个 for 循环用来统计能力值等于最大值的士兵数量,并输出这些士兵的编号。整个过程时间复杂度为 O(n^2)。
不过这个算法的时间复杂度比较高,如果输入数据量比较大,可能会超时。在实际应用中,我们可以使用更高效的排序算法来代替选择排序,例如快速排序、归并排序等。
阅读全文