随机打乱后贪心样例不过求调
查看原帖
随机打乱后贪心样例不过求调
804607
rainygame楼主2023/10/4 12:09

随机打乱之后每次都进入和最小的那个组,思路应该是没错的。

这个最小用堆维护。

代码如下:

#include <bits/stdc++.h>
using namespace std;
#define int long long
mt19937 rnd(time(0));

int n, m;
int a[21];
priority_queue<int, vector<int>, greater<int>> pq;

double x[7];
double ans(1e9), pj, res;

signed main(){
	cin >> n >> m;
	for (int i(1); i<=n; ++i) cin >> a[i];
	
	while (double(clock()) / CLOCKS_PER_SEC < 0.99){
		shuffle(a+1, a+n+1, rnd);
		for (int i(1); i<=m; ++i) pq.push(0);
		for (int i(1); i<=n; ++i){
			int tmp(pq.top()+a[i]);
			pq.pop();
			pq.push(tmp);
		}
		for (int i(1); i<=m; ++i){
			x[i] = pq.top();
			pq.pop();
			pj += x[i];
		}
		pj /= m;
		for (int i(1); i<=m; ++i) res += pow(pj-x[i], 2);
		ans = min(ans, sqrt(res/m));
	}
	
	printf("%.2lf", ans);
	
	return 0;
}

2023/10/4 12:09
加载中...