Codeforces Round #446 (Div. 2) D. Gluttony 构造,思维

D. Gluttony

题意: 给出一个 a[] 序列,要你构造一个 b[] 序列。 要满足任意的 a[] 与对应标号的 b[] 的和不相同。

tags:比赛的时候没想到。。

其实只要顺序排个序,然后偏移一下就好,有点”田忌赛马“的意思  ~_~

即 a1,a2,.....an  升序, 偏移一下变为 an,a1,......a[n-]   。 前 n-1 个 a[i] 都会比 对应的 b[i] 小。

如果标号不选 n 的话,那肯定不会相等; 如果选了 n ,那要相等,只能选取全部 n 个数才能相等,而题目确定了不能取 n 个数。

#include<bits/stdc++.h>
using namespace std;
#pragma comment(linker, "/STACK:102400000,102400000")
#define rep(i,a,b) for (int i=a; i<=b; ++i)
#define per(i,b,a) for (int i=b; i>=a; --i)
#define mes(a,b)  memset(a,b,sizeof(a))
#define INF 0x3f3f3f3f
#define MP make_pair
#define PB push_back
#define fi  first
#define se  second
typedef long long ll;
const int N = 200005;

int n, b[N];
pair< int , int > p[N];
int main()
{
    scanf("%d", &n);
    rep(i,1,n)
        scanf("%d", &p[i].fi), p[i].se=i;
    sort(p+1, p+1+n);
    b[p[1].se] = p[n].fi;
    rep(i,2,n)
        b[p[i].se] = p[i-1].fi;
    rep(i,1,n)
        printf("%d ", b[i]);


    return 0;
}
posted @ 2017-12-27 15:28  v9fly  阅读(110)  评论(0编辑  收藏  举报