Codeforces Round #538 (Div. 2) B. Yet Another Array Partitioning Task 思维

题解

题目大意 给你若干个数字 划分成k组 每组里面取m个最大值 要求每组的最大值总和最大

只需要在整个数组里面取k*m个最大值并记录所在位置 按照顺序遍历数字如果当前数字是被选中的最大值则cnt++
当cnt到达m时则说明当前位置是当前分段的最后位置 输出即可

AC代码

#include 
#include 
#define fs first
#define sc second
using namespace std;
typedef long long ll;

const int INF = 0x3f3f3f3f;
const int MAXN = 2e5 + 10;
int a[MAXN], b[MAXN]; //记录哪个位置被使用

int main()
{
#ifdef LOCAL
	freopen("C:/input.txt", "r", stdin);
#endif
	int n, m, k;
	cin >> n >> m >> k;
	vector<pair<int, int>> v;
	for (int i = 1; i <= n; i++)
		scanf("%d", &a[i]), v.push_back({ a[i], i });
	sort(v.begin(), v.end(), greater<pair<int, int>>());
	ll s = 0;
	for (int i = 0; i < m * k; i++) //只取前m*k大
		s += v[i].fs, b[v[i].sc] = 1;
	cout << s << endl;
	int cnt = 0;
	for (int i = 1; i <= n; i++)
		if (b[i])
		{
			cnt++;
			if (cnt == m && k > 1)
			{
				printf("%d ", i);
				cnt = 0, k--;
			}
		}
	cout << endl;

	return 0;
}

你可能感兴趣的:(Codeforces,思维)