Submission #635607

#TimeUsernameProblemLanguageResultExecution timeMemory
635607l_rehoRarest Insects (IOI22_insects)C++17
47.50 / 100
250 ms592 KiB
#include "insects.h" #include <bits/stdc++.h> using namespace std; void move_inside(int i); void move_outside(int i); int press_button(); int min_cardinality(int N) { int low = 1; int high = N; int nG = 0; map<int, bool> isIn; for(int i = 0; i < N; i++){ move_inside(i); isIn[i] = true; int ret = press_button(); if(ret == 2){ isIn[i] = false; move_outside(i); }else nG++; } for(int i = 0; i < N; i++) if(isIn[i]) {move_outside(i); isIn[i]=false;} while(low <= high){ int mid = low + (high-low)/2; // man mano che arrivo al borderline (mid) mi salvo qualcosa, l'ultimo inserito // e conto il numero di borderline // se il numero di borderline è uguale al numero di gruppi, allora // o la risposta è mid, oppure tutti questi superano il borderline // altrimenti scendo mid int cnt = 0, cnt1 = 0; for(int i = 0; i < N; i++){ move_inside(i); isIn[i] = true; int ret = press_button(); if(ret == mid) cnt++; if(ret == mid+1){ isIn[i] = false; move_outside(i); cnt1++; } } // cout<<"DEBUG-->"<<mid<<" "<<(N-cnt1)<<" "<<cnt1<<endl; if(cnt1 + mid * nG == N) low = mid+1; else high = mid-1; // devo cacciare quelli rimasti for(int i = 0; i < N; i++) if(isIn[i]) {move_outside(i); isIn[i]=false;} } return low-1; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...