一个优美序列满足任意的1<i,j<n有|a[i]-a[j]|<|i-j|,对于任意给定的序列你可以进行任意次操作交换a[i]与a[j],若在交换后满足优美序列则将该序列输出若不能则输出-1用c语言编写程序
时间: 2023-12-20 13:04:40 浏览: 80
以下是用C语言实现的程序:
```c
#include <stdio.h>
#include <stdbool.h>
bool check(int a[], int n) {
for (int i = 2; i < n; i++) {
for (int j = 1; j < i; j++) {
if (abs(a[i] - a[j]) >= abs(i - j)) {
return false;
}
}
}
return true;
}
int main() {
int n;
scanf("%d", &n);
int a[n + 1];
for (int i = 1; i <= n; i++) {
scanf("%d", &a[i]);
}
if (check(a, n)) {
for (int i = 1; i <= n; i++) {
if (i > 1) {
printf(" ");
}
printf("%d", a[i]);
}
printf("\n");
return 0;
}
for (int i = 1; i < n; i++) {
for (int j = i + 1; j <= n; j++) {
int t = a[i];
a[i] = a[j];
a[j] = t;
if (check(a, n)) {
for (int k = 1; k <= n; k++) {
if (k > 1) {
printf(" ");
}
printf("%d", a[k]);
}
printf("\n");
return 0;
}
t = a[i];
a[i] = a[j];
a[j] = t;
}
}
printf("-1\n");
return 0;
}
```
程序的思路是先判断给定的序列是否已经是优美序列,如果是则直接输出,否则枚举所有可能的交换并检查是否得到优美序列,如果找到了优美序列则输出,否则输出-1。检查是否为优美序列的函数check比较简单,直接按照题目给出的条件进行判断即可。
阅读全文