Codechef初学者permut2:获取错误-it在codechef上给出了错误的答案,但是对于样本输入给出了正确的答案

时间:2016-07-09 04:04:47

标签: c++ algorithm

问题

整数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;
}

1 个答案:

答案 0 :(得分:0)

问题是你无法在函数内创建如此大的(100000个元素)数组。您应该创建一个全局数组:

using namespace std;

const int MaxN = 100000;
int a[MaxN+2];

int main(){
...
}