模棱两可的排列问题代码:PERMUT2(codechef)

检查模棱两可的排列

输入: 输入包含几个测试用例。 每个测试用例的第一行包含一个整数n(1≤n≤100000)。然后在下一行中对整数1到n进行排列。连续整数之间只有一个空格字符。您可以假设1到n之间的每个整数在排列中恰好出现一次。 最后一个测试用例后跟一个零。

输出: 对于每个测试用例输出,排列是否模棱两可。遵循示例输出中显示的格式。

我的输出仍然正确,但代码在提交时返回错误的答案。不知道出什么问题了。

OR FALSE TRUE = IF FALSE TRUE TRUE
yonghuzhuxiao 回答:模棱两可的排列问题代码:PERMUT2(codechef)

我了解您的思考过程,即以置换表示的和与以反向置换表示的和应该相同,但是并非在所有情况下都是正确的,因为可能存在一些置换,它们的总和相等,但是它们是不big昧。

一种更简单,更可靠的方法是检查每个排列元素是否与逆排列匹配

浏览以下代码,该代码在Codechef上已接受状态:

#include<stdio.h>

int main(void) {
    int n,i;
    while(scanf("%d",&n),n!=0){

        int a[n];
        for(i=0; i<n; i++){
            scanf("%d",&a[i]);
        }
        i=n;
        int b[n];
        while(i>0){
            b[a[i-1]-1]=i;
            --i;
        }

        int flg = 1;

        for(int i=0;i<n;i++){
            if(a[i]!=b[i]){
                flg = 0;
                break;
            }
        }
        (flg==1) ? printf("ambiguous\n") : printf("not ambiguous\n");
    }
    return 0;
}

请随时提出任何疑问。

本文链接:https://www.f2er.com/3125548.html

大家都在问