Memo
•
문제를 이해하는게 좀 어려웠던 문제였습니다.
•
어떤 배열을 만들어야 할지 잘 고민해봐야 합니다.
•
처음 이닝의 선수를 배치하는 방법에 대한 고민이 필요합니다. 저는 순열을 통해 해결했습니다.
Code
제출 날짜
@3/21/2021
메모리
2024 KB
시간
332 ms
#include <iostream>
#include <queue>
#include <algorithm>
#include <string.h>
#include <vector>
#define endl "\n"
int N;
int max_score, score;
int record[51][10];
std::vector<int> players;
std::queue<int> q;
int base_condition[4];
void input_faster()
{
std::ios_base::sync_with_stdio(false);
std::cin.tie(0);
std::cout.tie(0);
}
void input()
{
input_faster();
std::cin >> N;
for (int i = 1 ; i <= N ; i++)
for (int j = 1 ; j <= 9 ; j++)
std::cin >> record[i][j];
players = {2, 3, 4, 5, 6, 7, 8, 9};
}
void make_one()
{
if (base_condition[3])
{
score++;
base_condition[3] = 0;
}
if (base_condition[2])
{
base_condition[3] = 1;
base_condition[2] = 0;
}
if (base_condition[1])
base_condition[2] = 1;
base_condition[1] = 1;
}
void make_two()
{
if (base_condition[3])
{
score++;
base_condition[3] = 0;
}
if (base_condition[2])
score++;
if (base_condition[1])
{
base_condition[3] = 1;
base_condition[1] = 0;
}
base_condition[2] = 1;
}
void make_three()
{
if (base_condition[3])
score++;
if (base_condition[2])
{
score++;
base_condition[2] = 0;
}
if (base_condition[1])
{
score++;
base_condition[1] = 0;
}
base_condition[3] = 1;
}
void make_homerun()
{
for (int i = 1 ; i <= 3 ; i++)
if (base_condition[i])
score++;
score++;
memset(base_condition, 0, sizeof(base_condition));
}
void make_run(int player_rec)
{
if (player_rec == 1)
make_one();
else if (player_rec == 2)
make_two();
else if (player_rec == 3)
make_three();
else if (player_rec == 4)
make_homerun();
}
void simulation()
{
int _N = N;
int ining = 0;
int pl; // 선수
int out_count;
score = 0;
while (_N--)
{
out_count = 0;
ining++; // 다음 이닝
memset(base_condition, 0, sizeof(base_condition));
while(out_count < 3)
{
pl = q.front(); // 타석에 등장
q.pop();
if (record[ining][pl] >= 1 && record[ining][pl] <= 4)
make_run(record[ining][pl]);
else
out_count++;
q.push(pl);
}
}
}
void solve()
{
do {
q = std::queue<int>();
for (size_t i = 0 ; i < players.size(); i++)
{
if (i == 3)
q.push(1);
q.push(players[i]);
}
simulation();
max_score = std::max(max_score, score);
}while(next_permutation(players.begin(), players.end()));
}
void print_val()
{
std::cout << max_score;
}
int main()
{
input();
solve();
print_val();
return (0);
}
C++
복사