做到这道题目,我是真的想吐槽有些人了。。。因为本人是一个很喜欢理清思路的人,如果不理清思路,我几乎不能向下走一步,所以吐槽某些思路混乱的人。。。
所以每每看到网上一些刷题的解题报告里面说:迷迷糊糊就AC了,我是坚决不做这种事情的。。。
这道题,英文题目是不太好懂,但是中文该好懂吧,本来可以很简单把题目说清楚的,看了discuss的一些伙计非把题目简单的意思说的很晦涩难懂。。。
真不知道这些哥们的大脑怎么长的,同样的水题,为什么不能搞的不这么“高端”呢。。。
让我想起了有时看解题报告,一些人的代码简直不能入目,完全不知道在想些什么,写的相当晦涩。。我说就不能用用途去命名每个变量吗。。。
进入正题,先放上discuss某哥们的解释:
新的排列中第i个数是旧的排列中数i(在旧的排列中)的位置。比如,新排列中5(第1个数)是旧排列中数1的位置(第5个)。
我看了一下,呵呵了一下,其实完全可以用更简单的表述。。。
下面贴我的解释:
就是新旧位置和数字的互换!比如,原来的数字和位置(位置用[]框起来)是:
2 3 4 5 1
[1] [2] [3] [4] [5]
-->
5 1 2 3 4
[1] [2] [3] [4] [5]
原来2在位置[1],现在1在位置[2]。。。以此类推,不知道为什么你们要说得这么麻烦
好了,贴代码:
#include <stdio.h> int a[100002]; int b[100002]; //a[]的反转序列 int main() { int n; int i; while(scanf("%d",&n) && n!=0) { for(i=1;i<=n;i++) scanf("%d",&a[i]); for(i=1;i<=n;i++) b[a[i]]=i; for(i=1;i<=n;i++) if(a[i]!=b[i]) break; if(i>=n+1) printf("ambiguous\n"); else printf("not ambiguous\n"); } return 0; }
简化为:
#include <stdio.h> int a[100002]; int main() { int n; int i; while(scanf("%d",&n) && n!=0) { for(i=1;i<=n;i++) scanf("%d",&a[i]); for(i=1;i<=n;i++) if(a[a[i]]!=i) break; if(i>=n+1) printf("ambiguous\n"); else printf("not ambiguous\n"); } return 0; }