Cod sursa(job #2017475)

Utilizator Stefan_RaduStefan Radu Stefan_Radu Data 1 septembrie 2017 14:03:46
Problema Plantatie Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.25 kb
#include <iostream>
#include <vector>

using namespace std;

int main() {
/*  freopen("input", "r", stdin);
  freopen("output", "w", stdout);*/

  ios::sync_with_stdio(false); cin.tie(0);

  int n, k;
  cin >> n >> k;

  vector < long long > v(n + 1);
  for (int i = 1; i <= n ; i ++) {
    cin >> v[i];
  }

  vector < long long > odd(k + 1);
  vector < long long > even(k + 1);
  vector < vector < long long > > group(k + 1);

  for (int i = 1; i <= k; i ++) {
    for (int j = i; j <= n; j += k) {
      group[i].push_back(j);
      if (v[j] % 2 == 1) 
        odd[i] ++;
      else 
        even[i] ++;
    }
  }

  long long sol = 0;
  for (int i = 1; i <= k; i ++) {
    if (even[i] < odd[i]) {
      for (auto x : group[i]) {
        if (v[x] % 2 == 0) v[x] = 1;
      }
      sol += even[i];
    }
    else {
      for (auto x : group[i]) {
        if (v[x] % 2 == 1) v[x] = 0;
      }
      sol += odd[i];
    }
  }

  long long test = 0;
  for (int i = 1; i <= k; i ++) {
    test += v[i];
  }
  if (test % 2 == 0) {
    cout << sol << '\n';
    return 0;
  }
  
  int good_sol = 1e9;
  for (int i = 1; i <= k; i ++) {
    int change = sol - min(even[i], odd[i]);
    change += max(even[i], odd[i]);

    good_sol = min(good_sol, change);
  }

  cout << good_sol << '\n';
}