zoukankan      html  css  js  c++  java
  • codeforces 891 b

    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 ",res[0]);

        else

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

    }

  • 相关阅读:
    LeetCode 3 Longest Substring Without Repeating Characters
    //……关于前后端分离与不分离
    //……关于HTTP与HTTPS
    //……关于报文
    <node>……express的中间件……//
    <git>……git的基本使用……//
    <mongoose>……find与findOne的区别……//
    //……关于TCP三次握手与四次挥手
    C#文件操作
    梯度下降的简单例子
  • 原文地址:https://www.cnblogs.com/mltang/p/7881323.html
Copyright © 2011-2022 走看看