题目链接
解题方法:贪心
题目分析
题目大意
给n个数字,这n个数字可以交换任意两个不相等的数字一次,问是否能形成一个非排序数列。也就是说,在交换完的数列中,存在三个数字a、b、c,使a<b且b>c 或者 a>b且b<c
解析
两种方法:分别对应下面两种代码。
方法一:
先正序扫一遍数组,找两组数一组a<b,一组a<c,且a的下标小于b的下标小于c的下标,交换a、b的值,则必有a>b且b<c。同时,找两组数一组a>b,一组a>c,且b的下标小于c的下标,交换a、b的值,则必有a<b且b>c。
再倒叙扫一遍数组,找两组数一组a<b,一组a<c,且a的下标大于b的下标大于c的下标,交换a、b的值,则必有a>b且b<c。同时,找两组数一组a>b,一组a>c,且b的下标大于c的下标,交换a、b的值,则必有a<b且b>c。
注:本方法参考acing.cf
方法二:
先把给的数字排序,生成一个上升序列,一个下降序列。也就是说,只要不是这两个序列,就是我们目标的unsorting array。
先排除特殊情况:
- 一开始给的数列a,既是上升序,又是下降序。
- 总共就俩数。
暴力枚举,将每两个位置的数字交换,看看交换之后是否会和上升序列或者下降序列之一完全相同,如果完全相同则枚举下一个位置如果没有结果,则输出-1。
函数解释:check()函数,检查该序列是否和a相同。这个函数还是比较巧妙的,每交换一次,要判断交换完的a[]和asc[]比较,再判断交换完的a[]和dsc[]比较,既然都和a比较,干脆就写一个和a比较的函数,用不动数组和变动数组比较。
代码
方法一:
1 |
|
方法二:
1 |
|