检查模棱两可的排列
输入: 输入包含几个测试用例。 每个测试用例的第一行包含一个整数n(1≤n≤100000)。然后在下一行中对整数1到n进行排列。连续整数之间只有一个空格字符。您可以假设1到n之间的每个整数在排列中恰好出现一次。 最后一个测试用例后跟一个零。
输出: 对于每个测试用例输出,排列是否模棱两可。遵循示例输出中显示的格式。
我的输出仍然正确,但代码在提交时返回错误的答案。不知道出什么问题了。
OR FALSE TRUE = IF FALSE TRUE TRUE
检查模棱两可的排列
输入: 输入包含几个测试用例。 每个测试用例的第一行包含一个整数n(1≤n≤100000)。然后在下一行中对整数1到n进行排列。连续整数之间只有一个空格字符。您可以假设1到n之间的每个整数在排列中恰好出现一次。 最后一个测试用例后跟一个零。
输出: 对于每个测试用例输出,排列是否模棱两可。遵循示例输出中显示的格式。
我的输出仍然正确,但代码在提交时返回错误的答案。不知道出什么问题了。
OR FALSE TRUE = IF FALSE TRUE TRUE
我了解您的思考过程,即以置换表示的和与以反向置换表示的和应该相同,但是并非在所有情况下都是正确的,因为可能存在一些置换,它们的总和相等,但是它们是不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;
}
请随时提出任何疑问。