Submission #731957

#TimeUsernameProblemLanguageResultExecution timeMemory
731957alextodoranRarest Insects (IOI22_insects)C++17
0 / 100
1 ms208 KiB
/**

 /\      /\
 \_\_//_/_/
  / 0  0  \
  \  /   \/
  /____ \/ \
  (o  o)/ \
   \__/\ \

**/

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

const int E_MAX = 11;

void move_inside (int i);
void move_outside (int i);
int press_button ();

int min_cardinality (int N) {
    bool in[N];
    fill(in, in + N, false);
    int dist = 0;
    for (int i = 0; i < N; i++) {
        move_inside(i);
        if (press_button() > 1) {
            move_outside(i);
        } else {
            dist++;
            in[i] = true;
        }
    }
    if (dist <= 4) {
        int occ[N];
        fill(occ, occ + N, 0);
        for (int i = 0; i < N; i++) {
            if (in[i] == false) {
                move_inside(i);
                for (int j = 0; j < N; j++) {
                    if (in[j] == true) {
                        move_outside(j);
                        if (press_button() == 1) {
                            occ[j]++;
                            break;
                        }
                        move_inside(j);
                    }
                }
            }
        }
        int mx = 0;
        for (int i = 0; i < N; i++) {
            mx = max(mx, occ[i] + 1);
        }
        return mx;
    }
    if (dist == N) {
        return 1;
    }
    int cnt = dist;
    int l = 1, r = N / dist;
    while (l < r) {
        int k = (l * 3 + r + 3) / 4;
        vector <int> v;
        for (int i = 0; i < N; i++) {
            int suff = 0;
            for (int j = i; j < N; j++) {
                if (in[j] == false) {
                    suff++;
                }
            }
            if (cnt + suff < dist * k) {
                break;
            }
            if (in[i] == false) {
                move_inside(i);
                if (press_button() > k) {
                    move_outside(i);
                } else {
                    in[i] = true;
                    v.push_back(i);
                    cnt++;
                }
            }
        }
        if (cnt == dist * k) {
            l = k;
        } else {
            r = k - 1;
            for (int i : v) {
                move_outside(i);
                in[i] = false;
                cnt--;
            }
        }
    }
    return l;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...