Submission #1215606

#TimeUsernameProblemLanguageResultExecution timeMemory
1215606alimqStudentsko (COCI14_studentsko)C++20
30 / 100
308 ms412 KiB
#include <bits/stdc++.h>
using namespace std;

const int n0=21;
int n,k,a[n0],p[n0];
array<int,2> b[n0];

int main() 
{
    cin >> n >> k;
    if(n>20) {
      return 0;
    }
    for(int i=0; i<n; i++) {
      cin >> a[i];
      b[i]={a[i],i};
    }
    sort(b,b+n);
    for(int i=0; i<n; i++) {
      p[b[i][1]]=i;
      // p - каким по величине является элемент, относительно других (0-й, 1-й, и т.д.)
    }
    int ans=n0;
    for(int i=0; i<(1<<n); i++) {
      // для тех что не в выборке, чекаем что порядок верный
      // все кто в 1 блоке идут до 2 блока, и т.д.
      // как проверить блок - просто поделить p[j] на k
      // 0 - первый блок (0...k-1)
      // 1 - второй блок и т.д.
      // поделить и посмотреть что массив отсортирован
      vector<int> check_if_sorted, t;
      for(int j=0; j<n; j++) {
        if(!(i>>j&1)) {
          check_if_sorted.push_back(p[j]/k);
          t.push_back(p[j]/k);
        }
      }
      sort(begin(t),end(t));
      bool sorted=1;
      for(int j=0; j<(int)t.size(); j++) {
        if(check_if_sorted[j]!=t[j]) {
          sorted=0;
        }
      }
      if(sorted) {
        // тогда, выборка хорошая
        ans=min(ans,__builtin_popcount(i));
      }
    }
    cout << ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...