您的位置:首页 > 其它

2011百度之星初赛B圆环

2012-05-25 11:30 267 查看
这是百度之星2011初赛B中的第一道题,题目也很水,只要找到解题思路就OK了。。

题目:

[align=center]时间限制:1000ms[/align]
[align=left]描述[/align]

[align=left]一个圆环上有n个位置,这n个位置按顺时针依次标号为1, 2, …, n。初始时圆环的每个位置上都有一个1至n之间的整数,且每个整数只出现一次。[/align]
[align=left]任何时刻,你可以将圆环上的数全部逆时针旋转一个位置,即第i个位置上的数变为原来第i + 1个位置上的数,第n个位置上的数变为原来第1个位置上的数。也可以将圆环上的数全部顺时针旋转一个位置,即第i个位置上的数变为原来第i – 1个位置上的数,第1个位置上的数变为原来第n个位置上的数。另有一个装置,可以交换圆环上第a个位置和第b个位置上的数。[/align]
[align=left]下图给出了三种操作的示例,圆环上有6个位置,初始数字分别为1, 2, 4, 3, 5, 6,能交换第2个和第3个位置上的数。经过一次逆时针旋转后变为2, 4, 3, 5, 6, 1,交换后变为2, 3, 4, 5, 6, 1,再经过一次顺时针旋转后变为1, 2, 3, 4, 5, 6。[/align]
[align=left] [/align]
[align=left] [/align]




[align=left][/align]
[align=left]请问通过旋转和交换,能否使得第i个位置上的数正好是i[/align]
[align=left][/align]

[align=left]输入[/align]

[align=left]输入包含多组数据。[/align]
[align=left]每组数据的第一行包含一个整数n,表示圆环上的数字个数。[/align]
[align=left]第二行包含两个整数a, b(1 ≤ a < bn),表示可以交换圆环上第a个位置和第b个位置上的数。[/align]
[align=left]接下来n行描述圆环上每个位置的初始值,其中第i行包含一个整数ai,表示初始时刻第i个位置上的数。[/align]
[align=left]最后一组数据之后的一行为一个0,表示输入结束。[/align]

[align=left]输出[/align]

[align=left]对于每个测试用例,输出一行,如果能满足要求,这行中应只包含一个单词Yes,如果不能满足要求,这行中应只包含一个单词No[/align]

[align=left]样例输入[/align]

[align=left]6[/align]
[align=left]2 3[/align]
[align=left]1[/align]
[align=left]2[/align]
[align=left]4[/align]
[align=left]3[/align]
[align=left]5[/align]
[align=left]6[/align]
[align=left]4[/align]
[align=left]1 3[/align]
[align=left]1[/align]
[align=left]2[/align]
[align=left]4[/align]
[align=left]3[/align]
[align=left]0[/align]

[align=left]样例输出[/align]

[align=left]Yes[/align]
[align=left]No[/align]

[align=left]提示[/align]

[align=left]对于100%的数据,1 ≤ n ≤ 1,000[/align]

解法思路:

首先我们定义“连通”的概念:如果在圆环中的位置可以互换,则我们认为这两个数是连通的。。。我们可以找到一个连通的一串数,则这串数中任意两个数是可以互换的。(why?自己证明把,很简单!)首先我们对每个数,找到他所属于的连通分支,然后从小到大进行排序。。。最后如果这些数能够组成连续的自然数,我们就认为这个圆环通过旋转和交换,能够使i的位置上的数是i。。

如图:









代码实现起来很容易,其实我也没写,希望有时间的同学可以写下。。。
本文出自 “沧海龙腾” 博客,请务必保留此出处http://canghailongteng.blog.51cto.com/4967747/877986
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: