알고리즘/BOJ

[백준] 17505 링고와 순열

세진짱 2019. 11. 8. 14:38

 

내가 i번 인덱스에 둔다는 것은 n-i개의 반전을 가질 수 있다는 말이다

물론 큰 수부터 둬야만 가능하다

시작점을 s 끝점을 e로 잡고

인덱스를 돌아가며 n-i개의 반전이 필요하면 e에있는 것을 놔주고

필요없다면 s에 있는것을 둔다

다 하고 k!=0 || s<=e라면 배열을 봤는데 만족못하거나

다 못본것이므로 -1이다

 

k값은 longlong이 될 수있으므로 주의하자!!

 

소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <algorithm>
using namespace std;
#define ll long long
ll n,k;
int ans[314166];
 
int main(){
    scanf(" %lld %lld",&n,&k);
    int s=1,e=n;
    for(ll i=1;i<=n;i++){
        if(k>=n-i){
            k-=(n-i);
            ans[i] = e--;
        } else ans[i]=s++;
    }
    if((k!=0|| (s<=e)) puts("-1");
    else for(int i=1;i<=n;i++printf("%d ",ans[i]);
}