以后变成入门赛和月赛了,每月痛失一次上分机会
1. 略
2. 酒店安排
排序后贪心计算
void solve() {
int n, m;
cin >> n >> m;
vector<int> a(n);
for (int i = 0; i < n; i++) cin >> a[i];
sort(a.begin(), a.end());
int ans = 1e9;
for (int i = m-1; i < n; i++) {
ans = min(ans, a[i] - a[i-m+1]);
}
cout << ans << '\n';
}
3. 男女搭配
贪心思想,考虑不派去参加特训可以组t个,先判断多出来的是否大于等于k,否则无脑(n+m-k)/3
void solve() {
int n, m, k;
cin >> n >> m >> k;
int t = min(n / 2, m);
if (n + m - t * 3 >= k) cout << t << '\n';
else cout << (n + m - k) / 3 << '\n';
}
4. 排列高手
显然,1 在一端 2 在另一端此时为最优排列,结果为
void solve() {
int n;
cin >> n;
// 1 在一端 2 在另一端
cout << (1LL * n * n + 5 * n - 2) / 2 << '\n';
}
5. 混乱的草稿纸
从大往小判断,如果后面的都没有动过并且满足顺序,则当前也不用动
void solve() {
int n, x;
cin >> n;
vector<int> idx(n+1);
for (int i = 1; i <= n; i++) {
cin >> x;
idx[x] = i;
}
int ans = 0, f = 0;
for (int i = n-1; i; i--) {
if (idx[i] < idx[i+1] && !f) continue;
else ans++, f = 1;
}
cout << ans << '\n';
}
6. 完美数对
void solve() {
int n, x;
cin >> n;
unordered_map<int, int> mp;
for (int i = 0; i < n; i++) {
cin >> x;
mp[x]++;
}
vector<pair<int, int>> v1, v2;
for (auto p : mp) {
v1.push_back({p.first, p.second});
v2.push_back({p.second, p.first});
}
int m = v1.size();
sort(v1.begin(), v1.end(), greater<pair<int, int>>());
sort(v2.begin(), v2.end(), greater<pair<int, int>>());
ll ans = 0;
vector<int> bit(n+1);
auto add = [&](int i, int x) {
for (; i <= n; i += i & -i) bit[i] += x;
};
auto sum = [&](int i) {
int res = 0;
for (; i; i -= i & -i) res += bit[i];
return res;
};
for (int i = 0, j = 0; i < m; i++) {
while (j < m && v2[j].first >= v1[i].first) {
add(v2[j].second, 1);
j++;
}
ans += sum(v1[i].second);
}
cout << ans << '\n';
}