题意: 给出一个 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; }