#include "mushrooms.h"
#include<bits/stdc++.h>
using namespace std;
const int sqt=121;
int solve(int n){
int resp=0;
vector<int>a, b;
a.push_back(0);
int id=1;
while(max(a.size(),b.size())<=sqt&&id<n){
vector<int>aux;
aux.push_back(0); aux.push_back(id);
if(use_machine(aux)) b.push_back(id);
else a.push_back(id);
id++;
}
resp=a.size();
if(a.size()>=sqt){
//cout << "A" << endl;
while(id<n){
vector<int>aux;
int qtd=0;
for(int i=0;i<a.size()-1;i++){
aux.push_back(a[i]);
if(id<n){
aux.push_back(id);
id++;
qtd++;
}
}
aux.push_back(a.back());
resp+=((2*qtd-use_machine(aux))/2);
}
}else{
//cout << "B" << endl;
while(id<n){
vector<int>aux;
int qtd=0;
for(int i=0;i<b.size()-1;i++){
aux.push_back(b[i]);
if(id<n){
aux.push_back(id);
id++;
qtd++;
}
}
aux.push_back(b.back());
resp+=(use_machine(aux)/2);
}
}
return resp;
}
int count_mushrooms(int n){
if(n<=500) return solve(n);
int resp=0;
vector<int>a, b;
a.push_back(0);
int id=1;
while(max(a.size(),b.size())<=3&&id<n){
vector<int>aux;
aux.push_back(0); aux.push_back(id);
if(use_machine(aux)) b.push_back(id);
else a.push_back(id);
id++;
}
if(a.size()>=3){
while(max(a.size(),b.size())<=sqt&&id<n){
vector<int>aux;
aux.push_back(id); id++;
aux.push_back(a[0]);
aux.push_back(a[1]);
aux.push_back(id); id++;
aux.push_back(a[2]);
int at=use_machine(aux);
vector<int>qm={0,3};
for(int k=0;k<2;k++){
if(at&(1<<k)) b.push_back(aux[qm[k]]);
else a.push_back(aux[qm[k]]);
}
}
}else{
while(max(a.size(),b.size())<=sqt&&id<n){
vector<int>aux;
aux.push_back(id); id++;
aux.push_back(b[0]);
aux.push_back(b[1]);
aux.push_back(id); id++;
aux.push_back(b[2]);
int at=use_machine(aux);
vector<int>qm={0,3};
for(int k=0;k<2;k++){
if(at&(1<<k)) a.push_back(aux[qm[k]]);
else b.push_back(aux[qm[k]]);
}
}
}
// ja ta certo essa parte
resp=a.size();
while(id<n){
if(a.size()>b.size()){
vector<int>aux;
int qtd=0;
for(int i=0;i<a.size()-1;i++){
aux.push_back(a[i]);
if(id<n){
aux.push_back(id);
id++;
qtd++;
}
}
aux.push_back(a.back());
resp+=((2*qtd-use_machine(aux))/2);
}else{
vector<int>aux;
int qtd=0;
for(int i=0;i<b.size()-1;i++){
aux.push_back(b[i]);
if(id<n){
aux.push_back(id);
id++;
qtd++;
}
}
aux.push_back(b.back());
resp+=(use_machine(aux)/2);
}
}
return resp;
}
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |