这几天一直都是夜里2,3钟睡的觉,好嗨呦,不行一定要调整生物钟了
昨天晚上打cf打自闭了,明明能半个小时秒的三个题愣是给让第二题给卡了,看来夜里在家还是不能集中注意力啊。
今天在自习室就搞了这一道题,紫书上的描述竟然是错的,,让我一度怀疑题面给的样例错了,后来仔细看了看题才知道是这样的意思。
题意:给定n的一个排列,让1–n由升序序列通过两种操作变成该序列。其中操作数要小于等于2(n的平方)。
两种操作即:(1)将序列前两个元素交换位置。
(2)将第一个元素移动到序列的尾部
解题思路:因为从有序变为无序的可能性太过千变万化,故采用逆向思维,即将题变为从一个无序的序列变为升序,并将操作2改为将序列尾部的一个元素移动到首部,并将记录的操作序列反向输出即可。
解题过程:若序列第一个元素比第二个元素大则交换两个元素。注意:若第一个元素为n则不能交换(否则会无限循环)。
之后检查序列是否是升序,若为升序则退出循环,否则将序列尾部的元素移动到首部再进行上面的判断。*
下面附上AC代码
#include <bits/stdc++.h>
#define FOPI freopen("INPUT.TXT", "r", stdin)
#define DOPI freopen("OUTPUT.TXT", "w", stdout)
#define FOR(i, x, y) for(int i = x; i <= y; i ++)
#define ROF(i, x, y) for(int i = x; i >= y; i --)
using namespace std;
typedef long long int ll;
const int ind=0x3f3f3f3f,N=1e3