Notice
Recent Posts
Recent Comments
Link
«   2025/07   »
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
Archives
Today
Total
관리 메뉴

LoCeL

[BOJ 7347] 플립과 시프트 본문

PS

[BOJ 7347] 플립과 시프트

LoCeL 2018. 11. 9. 11:18

 문제는 여기에서 확인 가능하다.


 한 번 플립이 수행될 때 마다, 디스크 하나를 사이에 두고 있는 두 디스크의 위치가 바뀐다. (문제에서의 그림 참고)

 전체 디스크의 개수가 홀수이면 항상 검은 디스크와 흰 디스크를 분리할 수 있다.


 반대로 디스크의 개수가 짝수라고 하자. 어느 한 디스크부터 시계방향으로 $1$부터 $m+n$까지 번호를 붙이면, 짝수 번호를 가지고 있는 디스크는 짝수 번호의 위치로만, 홀수 번호를 가지고 있는 디스크는 홀수 번호의 위치로만 움직일 수 있다.  두 종류의 디스크 중 흰 디스크가 연속적으로 모여있으면, 검은 디스크도 연속적으로 모여있게 된다. 


 흰 디스크를 연속적으로 모으는 경우만 고려하자. 흰 디스크를 연속적으로 모을 수 있다는 것은 짝수 번호를 가진 디스크의 수와 홀수 번호를 가진 디스크의 수가 2이상 차이나지 않는다는 것과 같다. 이를 이용하면 문제를 해결할 수 있다.

 

 코드는 다음과 같다.


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
#include<bits/stdc++.h>
 
using namespace std;
 
int T, N, D[30];
 
int solve() {
    if(N%2return 1;
    int even = 0, odd = 0;
    for(int i = 0; i < N; i++) {
        if(D[i]) {
            if(i%2) odd++;
            else even++;
        }
    }
    if(abs(even - odd) <= 1return 1;
    else return 0;
}
 
int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr); cout.tie(nullptr);
    cin >> T;
    while(T--) {
        cin >> N;
        for(int i = 0; i < N; i++cin >> D[i];
        if(solve()) cout << "YES" << '\n';
        else cout << "NO" << '\n';
    }
    return 0;
}
cs


'PS' 카테고리의 다른 글

[UCPC 2019] 이사 풀이  (0) 2019.08.01
[KOI'18] XCorr  (0) 2018.11.09
[KOI'09] 섞기 수열  (0) 2018.11.09
[IOI'18] COMBO  (0) 2018.09.11
[UCPC'18 예선] 나무탈출  (0) 2018.08.14
Comments