#构造#CF891B Gluttony
题目
有一个长度为 \(n\) 的数列 \(a\),数字互不相同,
现在要打乱这个数列,设其为 \(b\),
使得 \(a\) 的任意真子序列与对应的 \(b\) 的任意真子序列的数字和不同
输出任意一种合法的 \(b\),\(1<n\leq 22\)
分析
如果让 \(b\) 取 \(a\) 数字的后继,(\(\max\{a\}\) 取\min{a}),
那么数字和当且仅当整个数列才会相同,所以这样保证是有解的
代码
#include <cstdio>
#include <cctype>
#include <algorithm>
#define rr register
using namespace std;
int n,a[31],b[31];
inline signed iut(){
rr int ans=0; rr char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
return ans;
}
inline void print(int ans){
if (ans>9) print(ans/10);
putchar(ans%10+48);
}
signed main(){
n=iut();
for (rr int i=1;i<=n;++i) b[i]=a[i]=iut();
sort(b+1,b+1+n);
for (rr int i=1;i<=n;++i){
a[i]=lower_bound(b+1,b+1+n,a[i])-b;
print(b[a[i]%n+1]),putchar(32);
}
return 0;
}