一开始想到了判断输出-1的充分条件为a、b与(n/2)之间的大小关系,但实际上没有考虑到abs(a-b)大小所带来的后效性影响。
换句话讲,除了贪心地把a,b分别放到最前面和最后面,还分别需要模拟填充和模拟判断,也就是"下苦功夫"。
在这种思路明显的题目中,我们常常要考虑:是否在代码的实现上会遇到困难?
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int val[200],index;
void solve(){
int n,a,b;
scanf("%d%d%d",&n,&a,&b);
val[1]=a,val[n]=b;
index=n;
for(int i=2;i<=(n/2);i++){
if(index!=a&&index!=b){
val[i]=index;
}else{
i--;
}
index--;
}
for(int i=(n/2)+1;i<=n-1;i++){
if(index!=a&&index!=b){
val[i]=index;
}else{
i--;
}
index--;
}
int minn=n,maxx=1;
for(int i=1;i<=(n/2);i++)
minn=min(minn,val[i]);
for(int i=(n/2)+1;i<=n;i++)
maxx=max(maxx,val[i]);
if(minn!=a||maxx!=b){
printf("-1\n");
return;
}
for(int i=1;i<=n;i++)
printf("%d ",val[i]);
printf("\n");
}
int main(){
int t;
scanf("%d",&t);
while(t--){
solve();
}
return 0;
}