问题:
整数1到n的排列是这些整数的排序。因此,表示排列的自然方式是按此顺序列出整数。当n = 5时,置换可能看起来像2,3,4,5,1。 但是,还有另一种表示置换的可能性:您创建一个数字列表,其中第i个数字是置换中整数i的位置。让我们将这第二种可能性称为逆置换。上述序列的逆置换是5,1,2,3,4。 模糊排列是一种排列,不能与其逆排列区分开来。例如,置换1,4,3,2是模糊的,因为它的逆置换是相同的。为了摆脱这些烦人的样本测试用例,你必须编写一个程序来检测给定的排列是否含糊不清。
输入规范
输入包含几个测试用例。
每个测试用例的第一行包含一个整数n(1≤n≤100000)。然后在下一行中跟随整数1到n的置换。连续整数之间只有一个空格字符。您可以假设1和n之间的每个整数在排列中只出现一次。
最后一个测试用例后跟零。
输出规范
对于每个测试用例输出,排列是否模糊不清。遵守示例输出中显示的格式。
示例输入
4
1 4 3 2
5
2 3 4 5 1
1
1
0
答案:
#include<iostream>
#include<math.h>
using namespace std;
int main(){
int t;
while(true){
scanf("%d",&t); // no of digits/numbers
if(t ==0) //if its 0 then break
break;
int a[t+2],i=1;
while(t--){
scanf("%d",&a[i++]); // take t numbers
}
int f=0;
for(int j=1;j<i;j++){
int p=a[j]; //for every position take array value at that position
f=0;
if(a[p]!= j){ //for array value at that position check if its equal to index according to sample input or output
f=1; // if fails for any digit then break loop and not ambiguous
break;
}
}
if(f==1)
printf("not ambiguous\n"); //inverse ambiguous
else
printf("ambiguous\n"); //not ambiguous
}
return 0;
}
答案 0 :(得分:0)
问题是你无法在函数内创建如此大的(100000个元素)数组。您应该创建一个全局数组:
using namespace std;
const int MaxN = 100000;
int a[MaxN+2];
int main(){
...
}