1 条题解
-
0
直接每次 sort,65 分
#include <bits/stdc++.h> using namespace std; int n, w; int a[100000 + 5]; bool cmp(int a, int b) { return a > b; } int main() { cin >> n >> w; for (int i = 1; i <= n; i++) cin >> a[i]; for (int i = 1; i <= n; i++) { // 前 i 个人排序 sort(a + 1, a + i + 1, cmp); // 前 w% 是多少 int pos = max(1, i * w / 100); // 输出这个人 cout << a[pos] << " "; } return 0; }
每次只有一个数无序,使用插入排序更快,90 分
#include <bits/stdc++.h> using namespace std; int n, w; int a[100000 + 5]; int main() { cin >> n >> w; for (int i = 1; i <= n; i++) cin >> a[i]; for (int i = 1; i <= n; i++) { // 前 i 个人排序 // 此时 1~i-1 已经排好序了,只有第 i 个人没有排好序 // 可以使用插入排序,把 a[i] 调整到合适位置 int j = i; while (j > 1 && a[j] > a[j - 1]) { swap(a[j], a[j - 1]); j--; } // 前 w% 是多少 int pos = max(1, i * w / 100); // 输出这个人 cout << a[pos] << " "; } return 0; }
值域很小,直接计数排序超快,100 分
#include <bits/stdc++.h> using namespace std; int n, w; int a[100000 + 5]; int cnt[605]; int main() { cin >> n >> w; for (int i = 1; i <= n; i++) cin >> a[i]; for (int i = 1; i <= n; i++) { // 计数排序 cnt[a[i]]++; // 前 w% 是多少 int pos = max(1, i * w / 100); // 输出这个人(找到第 pos 大的人) for (int j = 600; j >= 0; j--) { if (pos <= cnt[j]) { cout << j << " "; break; } else pos -= cnt[j]; } } return 0; }
- 1
信息
- ID
- 8000
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 2
- 标签
- 递交数
- 11
- 已通过
- 4
- 上传者