题目链接:http://120.78.162.102/problem.php?id=6241
时间限制: 1 Sec 内存限制: 128 MB
题目描述
给一个 1 到 n 的排列,每次可以交换相邻两个数,问使用最少操作次数使得序列递增的方案是否唯一。
输入
多组输入,每组一个数n(1<=n<=10^5),然后是一个1~n的排列。
输出
方案唯一输出Yes,否则输出No。
样例输入
1
2
2 1
3
3 2 1
样例输出
Yes
Yes
No
解题思路
首先判断相邻的的非递增的有几个,如果有1个,那么从判断一下前向后判断交换或从后往前判断交换是否一遍就行,如果一遍都不行,证明不唯一。
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
int a[100010], b[100010];
int main()
{
int t, n, m, q;
while (~scanf("%d", &n))
{
t = 0;
for (int i = 1; i <= n; i++)
{
scanf("%d", &a[i]);
b[i] = a[i];
if (i != 1 && a[i] < a[i - 1])
t++;
}
if(t < 2)
{
if (t)
{
for (int i = 2; i <= n; i++)
if (a[i] < a[i - 1])
swap(a[i], a[i - 1]);
for (int i = 2; i <= n && t; i++)
if (a[i] < a[i - 1])
t = 0;
q = 1;
for (int i = n; i >= 2; i--)
if (b[i] < b[i - 1])
swap(b[i], b[i - 1]);
for (int i = 2; i <= n && q; i++)
if (b[i] < b[i - 1])
q = 0;
if (t || q)
cout << "Yes" << endl;
else cout << "No" << endl;
}
else cout << "Yes" << endl;
}
else cout << "No" << endl;
}
return 0;
}