UVA--11925(逆向思维)--简单偏中等题

这几天一直都是夜里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
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值