제출 #1299054

#제출 시각아이디문제언어결과실행 시간메모리
1299054orgiloogii버섯 세기 (IOI20_mushrooms)C++20
0 / 100
3 ms420 KiB
#include "mushrooms.h"
#include <bits/stdc++.h>
using namespace std;
//int count_mushrooms(int n) {
//	std::vector<int> m;
//	for (int i = 0; i < n; i++)
//		m.push_back(i);
//	int c1 = use_machine(m);
//	m = {0, 1};
//	int c2 = use_machine(m);
//	return c1+c2;
//}

int count_mushrooms(int n) {
//	vector <int> m;
	vector <int> as, bs;
	as.push_back(0);
	if (use_machine({0, 1}) == 1) {
		bs.push_back(1);
		if (n == 2) {
			return 1;
		}
		if (use_machine({0, 2}) == 1) {
			bs.push_back(2);
		}
		else {
			as.push_back(2);
		}
	}
	else {
		as.push_back(1);
		if (n == 2) {
			return 2;
		}
	}
	int i = 3;
	if (bs.size() == 2) {
		while (i < n - 1 && as.size() < 100 && bs.size() < 100) {
			int c = use_machine({bs[0], i, bs[1], i + 1});
			if (c == 3) {
				as.push_back(i);
				as.push_back(i + 1);
			}
			else if (c == 2) {
				as.push_back(i);
				bs.push_back(i + 1);
			}
			else if (c == 1) {
				as.push_back(i + 1);
				bs.push_back(i);
			}
			else {
				bs.push_back(i);
				bs.push_back(i + 1);
			}
			i += 2;
		}
	}
	else {
		while (i < n - 1 && as.size() < 100 && bs.size() < 100) {
			int c = use_machine({as[0], i, as[1], i + 1});
			if (c == 3) {
				bs.push_back(i);
				bs.push_back(i + 1);
			}
			else if (c == 2) {
				bs.push_back(i);
				as.push_back(i + 1);
			}
			else if (c == 1) {
				bs.push_back(i + 1);
				as.push_back(i);
			}
			else {
				as.push_back(i);
				as.push_back(i + 1);
			}
			i += 2;
		}
	}
	if (i == n) {
		return as.size();
	}
	if (i == n - 1) {
		if (use_machine({0, i}) == 1) {
			return as.size();
		}
		else {
			return as.size() + 1;
		}
	}
	int ans = as.size();
	if (bs.size() == 100) {
		while (i < n) {
			int j = i;
			vector <int> m;
			while (j < n && j < i + 100) {
				m.push_back(bs[j - i]);
				m.push_back(j);
				j++;
			}
			int c = use_machine(m);
			if (c % 2 == 1) {
				ans += 1;
			}
			ans += c / 2;
			i = j;
		}
		return ans;
	}
	while (i < n) {
		int j = i;
		int cnt = 0;
		vector <int> m;
		while (j < n && j < i + 100) {
			m.push_back(as[j - i]);
			m.push_back(j);
			j++;
			cnt++;
		}
		int c = use_machine(m);
		if (c % 2 == 1) {
			c++;
			ans += cnt - (c / 2);
		}
		else {
			ans += cnt - (c / 2);
		}
		i = j;
	}
	return ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...