题意
“爱丁顿数” E ,即满足有 E 天骑车超过 E 英里的最大整数 E。
现给定某人 N 天的骑车距离,请你算出对应的爱丁顿数 E。
思路
大于N
的数字直接当N + 1
就好了。直接上树状数组就好了。其实sort一下直接做确实更简便,两种写法都在下面给出。
代码
#include <bits/stdc++.h>
using namespace std;
struct BIT {
vector<int64_t> cnt;
BIT() {}
BIT(int n): cnt(n + 1) {}
void add (int pos, int64_t val) {
for (++pos; pos < cnt.size(); pos += pos & -pos)
cnt[pos] += val;
}
int64_t query(int pos) {
int64_t res = 0;
for (++pos; pos > 0; pos -= pos & -pos)
res += cnt[pos];
return res;
}
};
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int n;
cin >> n;
BIT bit(n + 2);
vector<int> a(n);
for (int& e : a) {
cin >> e;
if (e > n) e = n + 1;
bit.add(e, 1);
}
for (int i = n; i >= 0; --i) {
if (n - bit.query(i) >= i){
cout << i << '\n';
break;
}
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int n;
cin >> n;
vector<int> a(n);
for (int& e : a) cin >> e;
sort(a.begin(), a.end());
int ans = 0;
for (int i = n; i > 0; --i) {
if (a[n - i] > i) {
ans = max(ans, i);
break;
}
}
cout << ans << '\n';
return 0;
}
HINT
不定时更新更多题解,Basic Level 全部AC代码,详见 link ! ! !