Search
Duplicate

주차
0
문제번호
17281
언어
티어
골드
유형
구현
시뮬레이션
브루트포스
nj_Blog
nj_상태
이해도
풀이
사람
이해도 2
13 more properties

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++
복사