Gluttony
题目链接:CodeForces - 891B题意:给出一个没有重复数字的长度为n的序列a, 求a的一种排列组合构成序列b, 使得序列a的任意连续子序列的和不等于b对应的子序列和;(子序列长度<n);
我们可以构造这样的一个b,使得b[i]>a[i](b[i]是比a[i]大的第一个数),此时的b序列一定满足条件;(a序列最大的数对应最小的数);现在就需要思考怎样构造这样一个序列b;
可以先将a排序, 定义一个数组pos[i], 记录比i大的第一个数, 输出时输出数i对应的pos[i];由于i的范围是1e9, 所以pos用map;
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <map>
using namespace std;
int a[30], tmp[30];
map<int, int> pos;
int main(){
int n;
scanf("%d", &n);
for(int i=0; i<n; i++){
scanf("%d", &a[i]);
tmp[i]=a[i];
}
sort(tmp, tmp+n);
for(int i=0; i<n; i++)
pos[tmp[i]]=tmp[(i+1)%n];//找到比tmp[i]大的第一个数;
for(int i=0; i<n; i++){
printf("%d", pos[a[i]]);//输出比a[i]大的第一个数;
printf("%c", i==n-1?'\n':' ');
}
return 0;
}