1.题目链接。题目大意:n个人分成两组,人的编号是1-n。每个人都有一个val。现在分组的规则是这样的,首先选区val最大的以及左右k个作为第一组,第二轮挑选也是从剩下的中间挑选出val最大的及其左右两个,现在问你最后的分组情况。
2.首先根据val排序,放入队列。在后对于每次挑选,从队列里拿出元素,使用一个set维护一下下标。把左右的值存起来,然后从set里面删除。其实就是考察了一下STL用的熟练与否?
#include <bits/stdc++.h>
#include<queue>
using namespace std;
int main() {
int n, k;
cin >> n >> k;
vector<pair<int, int>> a(n);
for (int i = 0; i < n; ++i) {
cin >> a[i].first;
a[i].second = i;
}
sort(a.rbegin(), a.rend());
queue<int> q;
for (int i = 0; i < n; ++i) {
q.push(a[i].second);
}
set<int> idx;
for (int i = 0; i < n; ++i) {
idx.insert(i);
}
string ans(n, '0');
int who = 0;
while (!idx.empty()) {
while (!idx.count(q.front())) {
q.pop();
}
int pos = q.front();
q.pop();
vector<int> add;
auto it = idx.find(pos);
for (int i = 0; i <= k; ++i) {
add.push_back(*it);
if (it == idx.begin()) break;
--it;
}
it = next(idx.find(pos));
for (int i = 0; i < k; ++i) {
if (it == idx.end()) break;
add.push_back(*it);
++it;
}
for (auto it : add) {
idx.erase(it);
ans[it] = '1' + who;
}
who ^= 1;
}
cout << ans << endl;
return 0;
}