Polycarp Recovers the Permutation 构造(1000)

在这里插入图片描述
题意 :

  • 对于一个长度为n的排列和一个空序列ans,每次取当前最左边或者最右边中最小的值,如果取的是最左边,插入序列ans的最左边,然后在排列中删除这个数,如果取的是最右边,插入最右边,删除
  • 现在给出ans序列,问是否存在排列使得操作后的结果是ans,输出任意方案

思路 :

  • 首先,最后插入的数字一定是排列中最大的数字,也就是它一定在ans的左/右
  • 我们检测ans的首尾是否有一个n,如果不存在一定无解
  • 如果存在 :
  • 1.ans[1] == n,我们把ans[1]放到原数组的最左边,由于它是最大的,在每一次的操作中,它都可以让另一个数被取走,它本身最后才被取走,由于构造出来的结果是最外层的先被比较然后放入新的序列中,因此,将 [ 2 , n ] [2,n] [2,n]逆序即可
  • 2.ans[n] == n,对于 [ 1 , n − 1 ] [1,n-1] [1,n1]的数字,它们同样是逆序存储的
  • reverse第二个参数是)而不是]的
  • return cout << xxx << endl, void();,就不用换行return了
#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
#include <unordered_set>
#include <math.h>
using namespace std;

typedef long long ll;
typedef pair<int, int> PII;

#define endl '\n'
#define fi first
#define se second
#define push_back
#define rep(i, l, r) for (ll i = l; i <= r; i ++ )

const int N = 2e5 + 10;

int n, a[N];

void solve()
{
    cin >> n;
    for (int i = 1; i <= n; i ++ ) cin >> a[i];
    if (a[1] != n && a[n] != n) return cout << -1 << endl, void();
    if (a[1] == n) reverse(a + 2, a + n + 1);
    else if (a[n] == n) reverse(a + 1, a + n);
    for (int i = 1; i <= n; i ++ ) cout << a[i] << " \n"[i == n];
}

int main()
{
    cin.tie(nullptr) -> sync_with_stdio(false);
    
    int _;
    cin >> _;
    while (_ -- )
        solve();

    return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值