2016년 3월 15일 화요일

1138 - 한 줄로 서기

https://www.acmicpc.net/problem/1138

N명이 줄을 서는 모든 가짓 수 중에서 정답을 만족하는 경우를 출력했다.

N명이 줄을 서는 경우의 수 = O(N!)
매 번 조건에 만족하는 지 확인 = O(N)

next_permutation 을 썼다.
#include <bits/stdc++.h>
using namespace std;

bool isRight(int p[], int fr[], const int& n){
    int i, j;
    for(i=0; i<n; ++i){
        int front = 0;
        for(j=i-1; j>=0; --j) front += p[i] < p[j];
        if(front != fr[p[i]-1]) return false;
    }
    return true;
}

int main(){
    int i, p[10], n, fr[10];
    scanf("%d", &n);
    for(i=0; i<n; ++i){
        scanf("%d", &fr[i]);
        p[i] = i+1;
    }
    while( ! isRight(p, fr, n) ) std::next_permutation(p, p+n);
    for(i=0; i<n; ++i) printf("%d ", p[i]);
    return 0;
}

댓글 없음:

게시글 목록