mltang

博客园 首页 新随笔 联系 订阅 管理
B. Gluttony
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output

You are given an array a with n distinct integers. Construct an array b by permuting a such that for every non-empty subset of indices S = {x1, x2, ..., xk} (1 ≤ xi ≤ n0 < k < n) the sums of elements on that positions in a and b are different, i. e.

Input

The first line contains one integer n (1 ≤ n ≤ 22) — the size of the array.

The second line contains n space-separated distinct integers a1, a2, ..., an (0 ≤ ai ≤ 109) — the elements of the array.

Output

If there is no such array b, print -1.

Otherwise in the only line print n space-separated integers b1, b2, ..., bn. Note that b must be a permutation of a.

If there are multiple answers, print any of them.

Examples
input
2
1 2
output
2 1 
input
4
1000 100 10 1
output
100 1 1000 10
Note

An array x is a permutation of y, if we can shuffle elements of y such that it will coincide with x.

Note that the empty subset and the subset containing all indices are not counted.

 

讲一下题意把吧   这个题的意思就是n个数a1,a2,a3.......,这n个数重新排列构成b数组

                                     

这个题吧   sum1(左边式子)和sum2(右边式子)都是从0开始加的,只要我能够使a[i]<b[i],那么sum2一定比sum1要大   这就是确定的

但是很明显,我做不到这个,

于是我这么构造,每个a都找到一个刚刚大于它的数,最大的数用最小的数代替,假设我现在计算的集合中没有最大的数和最小的数的组合

那么我的每个b元素都大于与之对应的a    sum2一定大于sum1,

 

这时候我们再考虑最大的数和最小的数的组合在集合中的情况

由于我们的k<n && k>=1 那么我一定不可能把所有的情况都取干净  所以必定有一些集合是a < b没有取到的

这时候  正难则反  总共加和都是一样的,减去相差的,这时候sum1 > sum2了就

 

于是这样构造是能够满足题意的

 

丑陋的代码:

 

#include <iostream>

#include <cstdio>

#include <algorithm>

using namespace std;

int arr[30];

int res[30];

int bin(int left,int right,int n)

{

    int mid ;

    while(left < right)

    {

        mid = (left+right) >> 1;

        if(res[mid] > n) {

            right = mid;

        }

        else if(res[mid] == n) {

            return res[mid+1];

        }

        else if(res[mid] < n) {

            left = mid + 1;

        }

    }

    return res[mid+1];

}

int main()

{

    int n,i,j;

    int maxn = 0;

    bool color_flag = false;

    scanf("%d",&n);

    for(i =0 ; i < n; ++i) {

        scanf("%d",arr+i);

        res[i] = arr[i];

        maxn = max(maxn,arr[i]);

    }

    sort(res,res+n);

    for(i = 0; i < n - 1; ++i) {

        if(arr[i] == maxn)

            printf("%d ",res[0]);

        else

            printf("%d ",bin(0, n-1, arr[i]));

    }

    if(arr[i] == maxn)

        printf("%d\n",res[0]);

    else

        printf("%d\n",bin(0, n-1, arr[i]));

}

posted on 2017-11-22 21:17  mltang  阅读(172)  评论(0编辑  收藏  举报