题意:给出一个长度为n的序列a,要求构造出一个序列b.
满足a和b.下标相同的子序列(长度!=n),其和都不同. n<=22,a[i]<=1e9.
构造:若a[i]是序列的第j大 则令b[i]为序列的第j+1大(若a[i]为最大 则令b[i]为最小).
证明:现在任意选一组下标s={x1,x2...xk}
若s不含a最大值的下标 则b[x1,x2..xk] > a[x1,x2..xk]
满足a和b.下标相同的子序列(长度!=n),其和都不同. n<=22,a[i]<=1e9.
构造:若a[i]是序列的第j大 则令b[i]为序列的第j+1大(若a[i]为最大 则令b[i]为最小).
证明:现在任意选一组下标s={x1,x2...xk}
若s不含a最大值的下标 则b[x1,x2..xk] > a[x1,x2..xk]
若s含a最大值的下标 则s'={y1,y2..y[n-k]} b[y1,y2..y[n-k]]>a[y1..y[n-k]] 即b[x1...x[k]]<a[x1..x[k]]
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=5e3+5,inf=0x3f3f3f3f;
int n,a[N],v[N],b[N];
int main()
{
cin>>n;
for(int i=0;i<n;i++)
cin>>a[i],v[i]=a[i];
sort(v,v+n);
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(a[i]==v[j])
{
b[i]=v[(j+1)%n];
break;
}
}
}
for(int i=0;i<n;i++)
printf("%d ",b[i]);
return 0;
}