前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ACM刷题之路(九)数论-逆序组 交换座位

ACM刷题之路(九)数论-逆序组 交换座位

作者头像
Designer 小郑
发布2023-07-31 15:38:42
1510
发布2023-07-31 15:38:42
举报
文章被收录于专栏:跟着小郑学JAVA跟着小郑学JAVA

C 交换座位


时间限制(普通/Java):1000MS/3000MS          运行内存限制:65536KByte 总提交:185            测试通过:61

描述

学号分别为1,2,3,4,5,6,7,8的8位同学随机排成一排,现在想把他们按学号从小到大排序,在排序的时候每次只能其中的2位同学进行换位,请问最少需要几次这样的换位。

输入

输入有多组数据(组数至少20000),每组输入一个含有12345678的字符串。

输出

输出最少所需的交换次数。

样例输入

12345678 12365478 12345786

样例输出

0 1 2


分析:

由于数字只有8个数,所以可以暴力解决。

根据观察:

如果两个数需要对调,那么交换的次数为1;

如果三个数需要对调,那么交换的次数为2;

如果四个数需要对调,那么交换的次数为3;

...

观察可以得出:如果n个数需要对调,那么交换的次数为n-1;

所以我们只要通过搜索找出8个数字中有多少个“小组”。

比如12365487:有1、2、3、654、87 五大组,组员分别为1、1、1、3、2个人  所以交换次数等于0、0、0、2、1;

加起来就是三次。


AC代码如下:

代码语言:javascript
复制
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;

char a[9];
bool b[9];
int geshu;
void dfs(int x){
    b[x] = true;
    geshu++;
    if (b[a[x] - '0'] == false)
        dfs(a[x] - '0');
}

int main(){
    while (gets(a + 1)){
        int sum = 0, i, sum2 = 0;
        memset(b, false, sizeof(b));
        for (i = 1; i <= 8; i++){
            geshu = 0;
            if (b[i] == false){
                geshu = 0;
                dfs(i);
            }
            if (geshu > 1){
                sum += geshu - 1;
            }
        }
        cout << sum << endl;
    }
    return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-09-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • C 交换座位
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档