제출 #1076510

#제출 시각아이디문제언어결과실행 시간메모리
1076510mindiyakCounting Mushrooms (IOI20_mushrooms)C++14
60.75 / 100
7 ms600 KiB
#include "mushrooms.h" #include <iostream> #include <vector> #include <algorithm> #include <deque> using namespace std; const int S = 210; int brute(int n){ //A = 0 | B = 1 vector<int> type(n,-1); type[0] = 0; int pos = -1; for(int i = 1;i<n;i++){ if(use_machine({0,i}) == 0){ pos = i; type[i] = 0; break; }else{ type[i] = 1; } } // cerr << pos << endl; int a=pos+1,b=pos+2; while(pos != -1){ if(a >= n)break; if(b >= n){ if(use_machine({0,a}) == 0){ type[a] = 0; }else{ type[a] = 1; } }else{ int val = use_machine({a,0,b,pos}); if(val == 0){ type[a] = 0; type[b] = 0; }else if(val == 1){ type[a] = 1; type[b] = 0; }else if(val == 2){ type[a] = 0; type[b] = 1; }else if(val == 3){ type[a] = 1; type[b] = 1; } } a += 2; b += 2; } int ans = 0; // for(int i=0;i<n;i++)cerr << type[i] << " "; // cerr << endl; for(int i=0;i<n;i++)ans += (type[i]+1)%2; return ans; } int count_mushrooms(int n) { if(n < S+20)return brute(n); vector<int> A,B; deque<int> left; A.push_back(0); for(int i=1;i<n;i++)left.push_back(i); while(max(A.size(),B.size()) < S && left.size() > 0){ int val = use_machine({0,left[0],left[1]}); if(val == 0){ A.push_back(left[0]); A.push_back(left[1]); }else if(val == 1){ B.push_back(left[1]); left.push_back(left[0]); }else{ B.push_back(left[0]); A.push_back(left[1]); } left.pop_front(); left.pop_front(); } int ans = A.size(); while(left.size() > 0){ if(A.size() > B.size()){ vector<int> q; int m = 0,k = 0; while(m < A.size() && k < left.size()){ q.push_back(left[k]);k++; q.push_back(A[m]);m++; } ans += k-(use_machine(q)+1)/2; for(int i = 0;i<k;i++)left.pop_front(); }else{ vector<int> q; int m = 0,k = 0; while(m < B.size() && k < left.size()){ q.push_back(left[k]);k++; q.push_back(B[m]);m++; } ans += (use_machine(q)+1)/2; for(int i = 0;i<k;i++)left.pop_front(); } } return ans; }

컴파일 시 표준 에러 (stderr) 메시지

mushrooms.cpp: In function 'int count_mushrooms(int)':
mushrooms.cpp:97:12: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   97 |    while(m < A.size() && k < left.size()){
      |          ~~^~~~~~~~~~
mushrooms.cpp:97:28: warning: comparison of integer expressions of different signedness: 'int' and 'std::deque<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   97 |    while(m < A.size() && k < left.size()){
      |                          ~~^~~~~~~~~~~~~
mushrooms.cpp:106:12: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  106 |    while(m < B.size() && k < left.size()){
      |          ~~^~~~~~~~~~
mushrooms.cpp:106:28: warning: comparison of integer expressions of different signedness: 'int' and 'std::deque<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  106 |    while(m < B.size() && k < left.size()){
      |                          ~~^~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...