-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path1494.cpp
More file actions
94 lines (75 loc) · 2.55 KB
/
1494.cpp
File metadata and controls
94 lines (75 loc) · 2.55 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
/**
source:https://acm.timus.ru/problem.aspx?num=1494
Пояснения к примененному алгоритму:
Рассмотрим положение шаров, при котором результат будет однозначно "Not a proof". Заметим, что существуют наборы, которые можно трактовать как "Cheater", однако на самом деле они "Not a proof".
Из этого следует, что нужно проверять именно на соответствие набору для "Not a proof" - если будут расхождения, то вывести "Cheater", если ни одно расхождения не будет - "Not a proof".
Набор для "Not a proof" - такой набор, что, если бы мы не доставали ни один шар, то номера шаров шли бы в порядке возрастания.
Для проверки на соответствие такому набору при каждом изъятии шара будем предполагать, что все предыдущие шары уже находятся в лунке. Если при изъятии шара будет нарушено условие для "Not a proof", значит игрок - "Cheater".
*/
#include <iostream>
#include <stack>
#include <cstdint>
template <class T, class Size>
class Stack{
std::stack<T> stack;
public:
Size max_size = 0;
void push(T value)
{
if (stack.size() < max_size)
stack.push(value);
}
Size size()
{
return stack.size();
}
T pop()
{
T temp = stack.top();
stack.pop();
return temp;
}
T top()
{
return stack.top();
}
bool empty()
{
return stack.empty();
}
bool full()
{
return stack.size() == max_size;
}
void fill(T begin, T end)
{
for (T i = begin; i < end; i++)
stack.push(i);
}
};
int main()
{
Stack<uint32_t, uint32_t> stack;
uint32_t prev, cur;
std::cin >> stack.max_size;
std::cin >> prev;
stack.fill(1, prev);
for (uint32_t i = 1; i < stack.max_size; i++)
{
std::cin >> cur;
if (cur > prev)
{
stack.fill(prev + 1, cur);
prev = cur;
continue;
}
else
if (stack.pop() != cur)
{
std::cout << "Cheater";
return 0;
}
}
std::cout << "Not a proof";
return 0;
}