閱讀493 返回首頁    go 阿裏雲 go 技術社區[雲棲]


poj 2470 Ambiguous permutations

做到這道題目,我是真的想吐槽有些人了。。。因為本人是一個很喜歡理清思路的人,如果不理清思路,我幾乎不能向下走一步,所以吐槽某些思路混亂的人。。。

所以每每看到網上一些刷題的解題報告裏麵說:迷迷煳煳就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;
}




最後更新:2017-04-03 05:40:01

  上一篇:go C# 基礎知識 (五).變量類型和字符串處理
  下一篇:go java.lang.ClassNotFoundException: org.codehaus.jackson.JsonProcessingException 異常解決方案