https://www.acmicpc.net/problem/16882
16882번: 카드 게임
예제 1의 경우에 구사과가 7을 고르면 모든 카드가 제거되기 때문에, 큐브러버가 이길 수 없다. 예제 2의 경우에는 어떤 카드를 제거해도 카드 한 장이 남는다. 따라서, 큐브러버가 이긴다.
www.acmicpc.net
게임이론 문제입니다. 게임이론 문제들은 제 경험상 손으로 써가면서 경우의 수를 찾는게 가장 좋더라고요.
생각보다 직관적이어서 어렵지 않은 문제였습니다.
어떤 수를 가져가면 그보다 작은 수 들을 전부 없애고 마지막으로 카드를 전부 없앤 사람이 이기는 게임입니다.
직관적으로 가장 큰 수를 가져가게되면 큰 수를 제외한 모든 수를 가져갈 수 있게되고 따라서 가장 큰 수의 개수가 승리와 연관이 되있다는걸 알 수 있습니다.
먼저 홀수일때는 당연히 koosaga가 이기는걸 알 수 있습니다. 가장 큰 수를 집는 걸 반복하게되면 선턴인 koosaga가 당연히 이기게 됩니다.
짝수일때도 koosaga가 이기는 방법이 있습니다. 위에서 말했듯이 가장 큰 수를 홀수개일때 집기만 하면 이기게 되는 게임입니다. 그렇다면 두번째로 큰수를 집어서 가장 큰수만 남기고 다 없애게 된다면
결국 cubelover는 어쩔수없이 가장 큰 수를 집어서 홀수개만 남게됩니다.
그렇다면 cubelover가 이기는 경우의수는 모든 수가 같아서 가장 큰 수밖에 없어서 koosaga가 어쩔수없이 가장 큰수를 집어 홀수개로 만드는 경우의수겠죠.
#include<stdio.h>
#include<vector>
#include<algorithm>
#include<string>
#include<iostream>
#include<map>
#include<set>
#include<stack>
#include<queue>
#include<functional>
using namespace std;
void fast_io() {
cin.tie(0)->sync_with_stdio(0);
}
int main(){
fast_io();
int solve=0;
int ans=0;
int N;
cin>>N;
for(int x=0;x<N;x++){
int input;
cin>>input;
if(solve<=input){
if(solve==input){
ans++;
continue;
}
solve=input;
ans=1;
}
}
if(ans==1){
cout<<"koosaga";
}
else{
if(N-ans==0 && ans%2==0){
cout<<"cubelover";
}
else{
cout<<"koosaga";
}
}
}
'PS > boj' 카테고리의 다른 글
백준 4817 괄호 (C++) (0) | 2022.07.03 |
---|---|
백준 23022 숙제 (C++) (0) | 2022.07.02 |
백준 21940 가운데에서 만나기 (C++) (0) | 2022.06.30 |
백준 16117 실버런 (C++) (0) | 2022.06.29 |
백준 22345 누적거리 (0) | 2022.06.27 |