제출 #434585

#제출 시각아이디문제언어결과실행 시간메모리
434585arayi버섯 세기 (IOI20_mushrooms)C++17
90.76 / 100
11 ms336 KiB
#include "mushrooms.h" #include <iostream> #include <vector> #define ad push_back using namespace std; int n; vector<int> a, b, p; int sm; int count_mushrooms(int n) { ::n = n; if(n < 230) { p.ad(0); for (int i = 1; i < n; i++) { p.ad(i); if(use_machine(p) == 0) sm++; p.pop_back(); } return sm + 1; } a.ad(0); p.ad(0); p.ad(1); if(use_machine(p)) b.ad(1); else a.ad(1); p.pop_back(); p.ad(2); if(use_machine(p)) b.ad(2); else a.ad(2); p.pop_back(); int i; for (i = 3; i <= 230; i+=2) { p.clear(); if(a.size() >= b.size()) { p.ad(a[0]), p.ad(i); p.ad(a[1]), p.ad(i+1); int s = use_machine(p); if(s%2==1) b.ad(i+1); else a.ad(i+1); if(s>=2) b.ad(i); else a.ad(i); } else { p.ad(b[0]), p.ad(i); p.ad(b[1]), p.ad(i+1); int s = use_machine(p); if(s%2==1) a.ad(i+1); else b.ad(i+1); if(s>=2) a.ad(i); else b.ad(i); } } sm = a.size(); for (;i < n;) { p.clear(); if(a.size() >= b.size()) { int k = min((int)a.size(), n-i); for (int j = 0; j < k; j++) p.ad(a[j]), p.ad(i+j); int s = use_machine(p); if(s%2==1) b.ad(i+k-1), s--; else a.ad(i+k-1), sm++; k--, s/=2; sm+=k-s; i+=k+1; } else { int k = min((int)b.size(), n-i); for (int j = 0; j < k; j++) p.ad(b[j]), p.ad(i+j); int s = use_machine(p); if(s%2==1) a.ad(i+k-1), s--, sm++; else b.ad(i+k-1); s/=2; sm+=s; i+=k; } } return sm; }
#Verdict Execution timeMemoryGrader output
Fetching results...