AtCoder Beginner Contest 094
这场有点过于一眼了。
C
只需要排序然后取中间即可。注意是需要看一下是哪一边的哪一个的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| #include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 10; struct node { int id, num; } a[maxn]; int ans[maxn];
bool cmp(node x, node y) { return x.num > y.num; }
int main() {
int n;
cin >> n; for (int i = 1; i <= n; i++) { cin >> a[i].num; a[i].id = i; }
sort(a + 1, a + n + 1, cmp);
int mid = n >> 1;
for (int i = 1; i <= n; i++) { if (i <= mid) ans[a[i].id] = a[mid + 1].num; else ans[a[i].id] = a[mid].num; }
for (int i = 1; i <= n; i++) cout << ans[i] << '\n';
return 0; }
|
D
找最大的,接着找一个最接近他的一半的数字即可。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| #include <bits/stdc++.h> using namespace std; int a[100001], n, t; double minn = 2147000000, mid; int main() { cin >> n; for (int i = 1; i <= n; i++) cin >> a[i]; sort(a + 1, a + n + 1); mid = a[n] * 1.0 / 2; for (int i = 1; i <= n; i++) { if (a[i] < mid) { if (mid - a[i] < minn) { t = a[i]; minn = mid - a[i]; } } else { if (a[i] - mid < minn) { t = a[i]; minn = a[i] - mid; } } } cout << a[n] << ' ' << t; return 0; }
|