Advertisement
Ilinskaya

дележ

Oct 2nd, 2022 (edited)
992
0
Never
1
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.73 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define meow ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
  6. #define repeat(i, n) for(int (i)=0; (i)<(n); (i)++)
  7.  
  8. signed main() {
  9.     meow
  10.     int N, K;
  11.     cin >> N >> K;
  12.     vector<int> bills;
  13.     int a;
  14.     double M = 0;
  15.     repeat(i, N) {
  16.         cin >> a;
  17.         M += a;
  18.         bills.push_back(a);
  19.     }
  20.     M /= K;
  21.     vector<double> fMask(1 << N);
  22.     for (int mask = 0; mask < 1 << N; mask++) {
  23.         int sum = 0;
  24.         repeat(i, N) {
  25.             if (mask & (1 << i)) {
  26.                 sum += bills[i];
  27.             }
  28.         }
  29.         fMask[mask] = (sum - M) * (sum - M);
  30.     }
  31.     vector<vector<double>> f(K + 1, vector<double>(1 << N, INT_MAX));
  32.     repeat(i, 1 << N) {
  33.         f[0][i] = 0;
  34.     }
  35.     vector<vector<int>> p(K + 1, vector<int>(1 << N, 0));
  36.     for (int k = 1; k < K + 1; k++) {
  37.         for (int mask = 0; mask < (1 << N); mask++) {
  38.             for (int maskSmall = mask; maskSmall != 0; maskSmall = (maskSmall - 1) & mask) {
  39.                 int maskSmall2 = mask ^ maskSmall;
  40.                 if (f[k - 1][maskSmall] + fMask[maskSmall2] < f[k][mask]) {
  41.                     f[k][mask] = f[k - 1][maskSmall] + fMask[maskSmall2];
  42.                     p[k][maskSmall] = maskSmall2;
  43.                 }
  44.             }
  45.         }
  46.     }
  47.     vector<int> who(N, 0);
  48.     int BIGMASK = (1 << N) - 1;
  49.     for (int k = K; k > 0; k--) {
  50.         int MASKSMALL = p[k][BIGMASK];
  51.         for (int i = 0; i < N; i++) {
  52.             if (MASKSMALL & (1 << i)) {
  53.                 who[i] = k;
  54.             }
  55.         }
  56.         BIGMASK ^= MASKSMALL;
  57.     }
  58.     cout << sqrt(((f[K][(1 << N) - 1]) / K)) << "\n";
  59.     repeat(i, N) {
  60.         cout << who[i] << " ";
  61.     }
  62. }
Advertisement
Comments
Add Comment
Please, Sign In to add comment
Advertisement