Gluttony CodeForces - 891B

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;
}


猜你喜欢

转载自blog.csdn.net/sirius_han/article/details/80074220