【codeforces 1154E】stl使用

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;
}

猜你喜欢

转载自blog.csdn.net/weixin_41863129/article/details/89482757