Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- #define meow ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
- #define repeat(i, n) for(int (i)=0; (i)<(n); (i)++)
- signed main() {
- meow
- int N, K;
- cin >> N >> K;
- vector<int> bills;
- int a;
- double M = 0;
- repeat(i, N) {
- cin >> a;
- M += a;
- bills.push_back(a);
- }
- M /= K;
- vector<double> fMask(1 << N);
- for (int mask = 0; mask < 1 << N; mask++) {
- int sum = 0;
- repeat(i, N) {
- if (mask & (1 << i)) {
- sum += bills[i];
- }
- }
- fMask[mask] = (sum - M) * (sum - M);
- }
- vector<vector<double>> f(K + 1, vector<double>(1 << N, INT_MAX));
- repeat(i, 1 << N) {
- f[0][i] = 0;
- }
- vector<vector<int>> p(K + 1, vector<int>(1 << N, 0));
- for (int k = 1; k < K + 1; k++) {
- for (int mask = 0; mask < (1 << N); mask++) {
- for (int maskSmall = mask; maskSmall != 0; maskSmall = (maskSmall - 1) & mask) {
- int maskSmall2 = mask ^ maskSmall;
- if (f[k - 1][maskSmall] + fMask[maskSmall2] < f[k][mask]) {
- f[k][mask] = f[k - 1][maskSmall] + fMask[maskSmall2];
- p[k][maskSmall] = maskSmall2;
- }
- }
- }
- }
- vector<int> who(N, 0);
- int BIGMASK = (1 << N) - 1;
- for (int k = K; k > 0; k--) {
- int MASKSMALL = p[k][BIGMASK];
- for (int i = 0; i < N; i++) {
- if (MASKSMALL & (1 << i)) {
- who[i] = k;
- }
- }
- BIGMASK ^= MASKSMALL;
- }
- cout << sqrt(((f[K][(1 << N) - 1]) / K)) << "\n";
- repeat(i, N) {
- cout << who[i] << " ";
- }
- }
Advertisement
Advertisement