#构造#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;
}
posted @ 2021-09-25 09:59  lemondinosaur  阅读(36)  评论(0编辑  收藏  举报