[PAT解题报告] Sort with Swap

简单题,对一个0到(n-1)的排列排序,允许的操作是把一个数和0交换。
首先,假设任意两个数可以交换,次数其实就是每个(圈长-1)的总和。
什么叫做圈呢? 就是a应该在b的位置,b应该在c的位置,c应该在d的位置。。。。最后一个数应该在a的位置,这个圈假设包含m个元素,我们交换(m - 1)次,每次可以把一个元素放在正确的位置上,并且最后m个数肯定都在自己的位置了……所以题目等价于找圈。
对于这个题,多了一个条件,我们只能和0交换。
如果我们找到一个圈0,在圈里,我们可以每次用0和某一个交换,同样(m - 1)次之后,所有数在自己的位置。
如果0不在圈里,我们可以现交换一次把0换进来,把x换出去,然后同样(m - 1)次后,所有数到了自己的位置,0到了x应该在的位置,再把0和x交换一次,使得所有数到达正确位置。
所以总结一下:
找圈,如果圈长是m
(1) 0在圈里,需要(m - 1)次
(2) 0不在圈里,需要(m + 1)次
一个圈一个圈的解决即可。
找圈可以用一个mark数组标记经过了哪些元素,然后x = a[x]走下去,直到走到一个经过的元素(一定是第一个元素),就找到一个圈。

#include <cstdio>
#include <cstring>
#include <string>

using namespace std;

bool mark[100005];
int a[100005];

int give(int x) {
int r = 0;
bool have = false;
    for (;!mark[x];++r) {
        if (x == 0) {
            have = true;
        }
        mark[x] = true;
        x = a[x];
    }
    return have?(r - 1):((r <= 1)?0:(r + 1));
}

int main() {
int n;
    scanf("%d",&n);
    for (int i = 0; i < n; ++i) {
        scanf("%d",a + i);
    }
    int answer = 0;
    for (int i = 0; i < n; ++i) {
        answer += give(a[i]);
    }
    printf("%d\n",answer);
    return 0;
}

原题链接: http://www.patest.cn/contests/pat-a-practise/1067
全部评论
给nowcoder补充个样例,是我第一次没过去的PAT样例3  input: 3 0 2 1  output:3
1 回复 分享
发布于 2018-03-15 23:11
分析的太棒啦! 感谢!Thx
点赞 回复 分享
发布于 2018-09-04 15:45

相关推荐

09-17 20:37
已编辑
长沙学院 Java
涂莱:学院本重心后移,金10银11,甚至金11银12,战线拉长一点,对于学院本来说秋招是个持久战,加油吧
听劝,我这个简历该怎么改...
点赞 评论 收藏
分享
头像
11-03 16:48
已编辑
百度_高级研发工程师
事实是检验真理的唯一标准。&nbsp;无论我们怎么去说,去讲述,去证明,都抵不过一个offer来得实在,无论我们怎么去复现求职中的摸爬滚打、扒皮抽筋、狼狈不堪,都抵不过你在简历写上大厂的名字(外包不算)。&nbsp;所以在我求职期间,我什么话都不说,什么话都不讲,因为没有意义,虽然我总讲过程才是意义,但只有当你上岸的那一刻,你才有资格回想在水里的挣扎,只有等你出了山,你才知道山的全貌。&nbsp;我为什么一定要离开华为OD,难道它不稳定吗,不能赚钱吗。为了证明自己,那肯定有的。其实更多的是印证我的认知是否真的正确。&nbsp;(给不了解我的人交代一下背景,在下双非一本,gap一年,华为OD外包,摸爬滚打4个月,艰难上岸百度正编)一、...
先锋战士:说得很真诚。鄙视链自古有之,学历,家庭背景,财富,权利。从小有之,小学羡慕那些当班委的,中学羡慕那些学生会的,高中羡慕尖子班拿教学金的,大学羡慕高绩点,毕业了羡慕进大厂的。工作了,又羡慕高职级的,再后来又羡慕别人早早结婚的。我想表达的观点很简单,无论是华为od还是百度,都是经历,没有孰高孰低,为了抵达下一个风景,总会付出更多东西,但不就是人生吗?正如登山,每个阶段的山,都要想办法攀登,在博主的文字中,见到了坚持和积极寻找问题解决办法的心态
学历对求职的影响
点赞 评论 收藏
分享
评论
点赞
3
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务