POJ 2470 Ambiguous permutation(我的水题之路——位置和值的队列)
2012-02-11 11:16
405 查看
Ambiguous permutations
Description
Some programming contest problems are really tricky: not only do they require a different output format from what you might have expected, but also the sample output does not show the difference. For an example, let us look at permutations.
A permutation of the integers 1 to n is an ordering of these integers. So the natural way to represent a permutation is to list the integers in this order. With n = 5, a permutation might look like 2, 3, 4, 5, 1.
However, there is another possibility of representing a permutation: You create a list of numbers where the i-th number is the position of the integer i in the permutation. Let us call this second possibility an inverse permutation. The inverse permutation
for the sequence above is 5, 1, 2, 3, 4.
An ambiguous permutation is a permutation which cannot be distinguished from its inverse permutation. The permutation 1, 4, 3, 2 for example is ambiguous, because its inverse permutation is the same. To get rid of such annoying sample test cases, you have to
write a program which detects if a given permutation is ambiguous or not.
Input
The input contains several test cases.
The first line of each test case contains an integer n (1 <= n <= 100000). Then a permutation of the integers 1 to n follows in the next line. There is exactly one space character between consecutive integers. You can assume that every integer between 1 and
n appears exactly once in the permutation.
The last test case is followed by a zero.
Output
For each test case output whether the permutation is ambiguous or not. Adhere to the format shown in the sample output.
Sample Input
Sample Output
Hint
Huge input,scanf is recommended.
Source
Ulm Local 2005
对于一个有N个元素的队列,队列元素为[1,2,...,N-1,N],进行一次队列变换,当前队列“数字i的位置”将成为变换后队列的第i个元素的值(下标从1开始)。
一开始拿到题目基本上又是什么都没有读懂的状态,就知道又是讨厌的英文题了。。。搞懂题意之后简单模拟就可以出解。
代码(1AC):
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 5245 | Accepted: 3095 |
Some programming contest problems are really tricky: not only do they require a different output format from what you might have expected, but also the sample output does not show the difference. For an example, let us look at permutations.
A permutation of the integers 1 to n is an ordering of these integers. So the natural way to represent a permutation is to list the integers in this order. With n = 5, a permutation might look like 2, 3, 4, 5, 1.
However, there is another possibility of representing a permutation: You create a list of numbers where the i-th number is the position of the integer i in the permutation. Let us call this second possibility an inverse permutation. The inverse permutation
for the sequence above is 5, 1, 2, 3, 4.
An ambiguous permutation is a permutation which cannot be distinguished from its inverse permutation. The permutation 1, 4, 3, 2 for example is ambiguous, because its inverse permutation is the same. To get rid of such annoying sample test cases, you have to
write a program which detects if a given permutation is ambiguous or not.
Input
The input contains several test cases.
The first line of each test case contains an integer n (1 <= n <= 100000). Then a permutation of the integers 1 to n follows in the next line. There is exactly one space character between consecutive integers. You can assume that every integer between 1 and
n appears exactly once in the permutation.
The last test case is followed by a zero.
Output
For each test case output whether the permutation is ambiguous or not. Adhere to the format shown in the sample output.
Sample Input
4 1 4 3 2 5 2 3 4 5 1 1 1 0
Sample Output
ambiguous not ambiguous ambiguous
Hint
Huge input,scanf is recommended.
Source
Ulm Local 2005
对于一个有N个元素的队列,队列元素为[1,2,...,N-1,N],进行一次队列变换,当前队列“数字i的位置”将成为变换后队列的第i个元素的值(下标从1开始)。
一开始拿到题目基本上又是什么都没有读懂的状态,就知道又是讨厌的英文题了。。。搞懂题意之后简单模拟就可以出解。
代码(1AC):
#include <cstdio> #include <cstdlib> #include <cstring> int arr[110000]; int end[110000]; int change(int arr[], int n){ //0 not ambiguous 1 ambiguous int i, j; int flag = 1; for (i = 1; i <= n; i++){ end[arr[i]] = i; } for (i = 1; i <= n; i++){ if (end[i] != arr[i]){ flag = 0; } } return flag; } int main(void){ int n, i; while (scanf("%d", &n), n != 0){ memset(arr, 0, sizeof(arr)); memset(end, 0, sizeof(end)); for (i = 1; i <= n; i++){ scanf("%d", &arr[i]); } if (change(arr, n)){ printf("ambiguous\n"); } else{ printf("not ambiguous\n"); } } return 0; }
相关文章推荐
- POJ 3438 Look and Say(我的水题之路——N个M的队列)
- POJ 1250 Tanning Salon(我的水题之路——字母表数组标记)
- POJ 2562 Primary Arithmetic(我的水题之路——模拟加法进位)
- POJ 2664 Prerequisites?(我的水题之路——选课)
- POJ 2924 Gauß in Elementary School(我的水题之路——n到m的连和)
- POJ 2070 Filling Out the Team(我的水题之路——double比较)
- POJ 2390 Bank Interest(我的水题之路——double和floa计算差别)
- POJ 2575 Jolly Jumpers(我的水题之路——数组绝对差值为1到n-1)
- POJ 3006 Dirichlet's Theorem on Arithmetic Progressions(我的水题之路——加i个d后的第几个素数)
- POJ 3300 Tour de France(我的水题之路——车轮角速度最大)
- POJ 2665 Trees(我的水题之路——移树,POJ100题啦!)
- POJ 2470 Ambiguous permutations(简单题 理解题意)
- POJ 2163 Easy Trading(我的水题之路——数组阶段n m的平均值比较)
- POJ 2459 Feed Accounting(我的水题之路——英文题啊!!!)
- POJ 2578 Keep on Truckin'(我的水题之路——谁先大于168)
- POJ 2840 Big Clock(我的水题之路——水,钟)
- POJ 3030 Nasty Hacks(我的水题之路——比较大小)
- poj 2470 Ambiguous permutations
- POJ 2823Sliding Window(单调队列水题)
- POJ 2081 Recaman's Sequence(我的水题之路——空间换时间)