0分求条(玄关,但是大概明天)
查看原帖
0分求条(玄关,但是大概明天)
1205074
Kaf_yoU楼主2024/8/31 21:34

rt,蒟蒻觉得大概率是思路错了,各位dalao指教一下哪里错了awa。

大致思路:如果一共能凑成的小组数不足则输出 -1。

否则先选出 k - 1 个小组,再看剩下的人里面人数分布情况,大于2的加上2,否则直接加上去(因为要 k 个小组那么最多可以搞 k - 1 个小组,再把剩下的不能凑成一个小组的人数加上去)

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 2e5 + 10;
int t;

signed main ()
{
	cin >> t;
	while (t --)
	{
		int n, k, a[N]; cin >> n >> k;
		int cnt = 0, sum = 0;
		for (int i = 1; i <= n; i ++)
		{
			int ti; cin >> ti;
			cin >> a[i];
			cnt += a[i] / 3;
		}
		
		if (cnt < k)
		{
			cout << -1 << '\n';
			continue;
		}
		
		sort (a + 1, a + 1 + n);
		int i; cnt = 0;
		for (i = n; i > 0; i --)
		{
			cnt += a[i] / 3;
			if (cnt >= k)
			{
				cnt -= a[i] / 3;
				sum += (k - 1 - cnt) * 3 + (a[i] / 3 - (k - 1 - cnt)) * 2;
				break;
			}
			sum += a[i];
		}
		for (i = i - 1; i > 0; i --) sum += (a[i] > 2 ? 2 : a[i]);
		cout << sum << '\n';
	}
	return 0;
}
2024/8/31 21:34
加载中...