1759G-Restore the Permutation

2024-05-24 04:12
文章标签 restore permutation 1759g

本文主要是介绍1759G-Restore the Permutation,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目链接:Restore the Permutation

        题目要求字典序最小,因此我们贪心的考虑,假设b数组为 4 3 6,那么我们贪心的考虑得到的结果是 1 4 2 3 5 6 ,但是如果b数组是8 7 4 5 那么我们不能够是1 8 2 7 3 4 6 5,因为最后一个数明显不符合。

        因此我们从后往前枚举,寻找第一个比这个数小的数,然后删除这个数,因此我们可以采用lower_bound()函数来寻找第一个比它小的数,用vector记录除了选择的数,如果这个数被选,那么就erase。

        那么什么情况下是-1呢?当然只有从后往前枚举的时候剩余的数不能找到和它匹配的数,也就是说没有比它小的数了,那么我们可以从1到n遍历,判断枚举到i时b数组中的数枚举到的数的个数和没有在b数组的个数,再进行比较即可。

代码附上:

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 2e5+5;
int a[N];
int n;
int top=0;
vector<int>b;
int ans[N];
int vis[N];void solve(){cin>>n;top=0;b.clear();for(int i=0;i<=n;i++)vis[i]=0;for(int i=1;i<=n/2;i++)cin>>a[i];for(int i=1;i<=n/2;i++){if(!vis[a[i]])vis[a[i]]=1;else {cout<<-1<<"\n";return;}}	int c1=0,c2=0;for(int i=1;i<=n;i++){if(!vis[i]){b.push_back(i);c1++;}else {c2++;if(c1<c2){cout<<-1<<"\n";return;}}}sort(b.begin(),b.end());for(int i=n/2;i>=1;i--){int p=lower_bound(b.begin(),b.end(),a[i])-b.begin()-1;ans[i]=b[p];b.erase(b.begin()+p);}for(int i=1;i<=n/2;i++){cout<<ans[i]<<" "<<a[i]<<" ";}cout<<"\n";}signed main(){ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);int t;cin>>t;while(t--){solve();}return 0;
}

这篇关于1759G-Restore the Permutation的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/997332

相关文章

SQL Server中,用Restore DataBase把数据库还原到指定的路径

restore database 数据库名 from disk='备份文件路径' with move '数据库文件名' to '数据库文件放置路径', move '日志文件名' to '日志文件存放置路径' Go 如: restore database EaseWe from disk='H:\EaseWe.bak' with move 'Ease

数据分析:置换检验Permutation Test

欢迎大家关注全网生信学习者系列: WX公zhong号:生信学习者Xiao hong书:生信学习者知hu:生信学习者CDSN:生信学习者2 介绍 置换检验是一种非参数统计方法,它不依赖于数据的分布形态,因此特别适用于小样本数据集,尤其是当样本总体分布未知或不符合传统参数检验的假设条件时。置换检验的基本思想是通过随机置换样本来评估观察到的统计量是否显著不同于随机情况下的预期值。最初真正认识置换检

博弈论+递推+调和级数枚举,CF 1033C - Permutation Game

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 1033C - Permutation Game 二、解题报告 1、思路分析 我们考虑一个位置符合什么条件可以必胜? 如果可以跳到一个必败的位置 考虑最大的格子一定是必败 而每个格子只能跳到比自己大的格子 于是我们就可以倒序处理状态 对于每个格子枚举比自己大

484. Find Permutation

https://leetcode.com/problems/find-permutation/description/ 题目大意:给一串DDII…D代表下降趋势,I代表上升.根据这一串DDII的序列构建出一个整数vector,且若有多个vector符合要求,返回字典序最小的. 解题思路:根据讨论的思路,首先构建出完全增序(IIII….)的序列1,2,3,4,…n,然后找序列中所有的D,将对应位

Clickhouse备份恢复_clickhouse-client方式backup_restore命令备份恢复的使用介绍

Clickhouse备份恢复也可以使用clickhouse-client的backup和restore命令,参见https://clickhouse.com/docs/en/operations/backup#command-summary clickhouse-client的backup命令备份出来的备份包的内容和开源工具clichouse-backup备份出来的备份包的内容类似,应该都是物理

pdb restore flashback recover 的三个办法 + CDB 级还原 注意数据库实际时间

Recover可以drop掉PDB,另外两个不行!! 除非CDB级还原  千万要注意好数据库时间 RMAN>  recover pluggable database pdb  until time "to_date('16-JUN-2024 19:00:00','DD-MON-YYYY HH24:MI:SS')" auxiliary destination '+data1'; Sta

Restore IP Addresses问题及解法

问题描述: Given a string containing only digits, restore it by returning all possible valid IP address combinations. 示例: Given "25525511135", return ["255.255.11.135", "255.255.111.35"]. (Order do

POJ 2718 Smallest Difference(暴力,全排列,next_permutation)

题目链接:http://poj.org/problem?id=2718 题意:给出2-10个数(个位数0-9),用这几个数组成两个数(除0之外,首位不能为0),求这两个数的最小值。 题解:两个数差值最小首先保证位数差值最小,所以对这几个数从中间分开,组成两个数,求出差值。用到STL中的next_permutation()函数。 代码: #include<iostream>#inclu

Permutation Test 置换检验(转)

Permutation Test 置换检验 显著性检验通常可以告诉我们一个观测值是否是有效的,例如检测两组样本均值差异的假设检验可以告诉我们这两组样本的均值是否相等(或者那个均值更大)。我们在实验中经常会因为各种问题(时间、经费、人力、物力)得到一些小样本结果,如果我们想知道这些小样本结果的总体是什么样子的,就需要用到置换检验。 Permutation test 置换检验是Fisher于2

全排列问题算法及实现(Permutation)

前言 做项目遇到数据采集系统中ADC拼合问题,如果顺序不对,波形就是错误的(题外话),为了找到正确的顺序,涉及到排列问题。 什么是排列组合 定义 一般地,从n个不同元素中取出m(m≤n)个元素,按照一定的顺序排成一列,叫做从n个元素中取出m个元素的一个排列(Arrangement)。特别地,当m=n时,这个排列被称作全排列(Permutation)。  Ex:考虑三个数字1,2,3,这个序