首页 > 其他分享 >整理书籍

整理书籍

时间:2023-09-06 12:37:10浏览次数:28  
标签:10 int 样例 ret ++ 整理 长度 书籍

整理书籍

书架上有若干本书排成一排。

每本书要么是大型书(用 L 表示),要么是中型书(用 M 表示),要么是小型书(用 S 表示)。

我们希望所有书能够从大到小有序排列,也就是说,所有大型书都在左侧,所有中型书都在中间,所有小型书都在右侧。

为此,你可以进行任意次交换操作,每次可以任选两本书并交换它们的位置。

请你计算,为了让所有书按要求有序排列,至少需要进行多少次交换操作。

输入格式

共一行,包含一个由 L、M、S 构成的字符串,表示初始时每个位置上的书的类型。

输出格式

一个整数,表示所需要的最少交换操作次数。

数据范围

输入字符串的长度范围 $[1,5 \times 10^5]$。

输入样例1:

LMMMS

输出样例1:

0

样例1解释

无需任何操作,初始排列已经符合要求。

输入样例2:

LLSLM

输出样例2:

2

样例2解释

一种最佳方案如下:

  • 第一步,交换 S 和 M,序列变为 LLMLS。
  • 第二步,交换 M 和它右边的 L,序列变为 LLLMS 。

 

解题思路

  看到选择任意两个位置交换来使得序列有序,很容易想到全排列的置换群。不过要用全排列的置换群的做法的话要保证没用重复元素出现,很明显这题不适用。不过实际上还是会用到环图,做法也是很类似的。

  令$L$,$M$,$S$分别对应$0$,$1$,$2$。假设原始序列是$a$,排序后的序列是$b$,依次遍历每一个元素,让$a_i$向$b_i$连一条边,就会得到一个环图。例如有$a=[0,0,2,0,1]$,对应的就有$b=[0,0,0,1,2]$,得到的图如下:

  可以发现构造图的方式与构造全排列置换群是一样的,建边方式都是$p_i \to i$。不过这个问题中不同种类的元素最多只有$3$种,因此图中最多有$3$个节点(可以类比,当不同种类的元素最多有$n$种,那么图中最多有$n$个节点)。同时每个节点的入度与出度都是一样的,因为同一个值在$a$和$b$中出现的次数都一样,因此这个图也是一个欧拉图,而欧拉图也是由一堆环构成的。

  我们最终要将序列$a$变成$b$,意味着要将图变成$n$个自环,与全排列的置换群一样,每交换两个元素最多让一个环裂变成两个环。假设当前有$m$个环,由于最终要变成$n$个自环,因此至少要交换$n-m$次。可以发现要使得$n-m$尽可能小,就要让$m$尽可能的大,即对于构造出的原图中要找到尽可能多的环。

  可以发现在这个问题中环的长度只有三种,即长度为$1$的自环,长度为$2$的环,以及长度为$3$的大环。为此我们应该从长度最小的环开始找起,因为环的长度越小则用到的边也越少,剩的边越多得到的环可能会更多。

  定义$3 \times 3$的矩阵$e$,其中$e_{i,j}$表示从节点$i$指向$j$的边的数量(即图的邻接矩阵表示)。那么长度为$1$的环的数量就是$e_{0,0}+e_{1,1}+e_{2,2}$,能得到长度为$2$的环的最大数量是$\min\{e_{0,1},e_{1,0}\} + \min\{e_{1,2},e_{2,1}\} + \min\{e_{0,2},e_{2,0}\}$。然后在图中删除已选出来的边,由于删边后还是保证图中每个节点的入度和出度相同,因此图中就只剩下长度为$3$的大环,且任意两点间边的数量都相同,所以长度为$3$的环的数量就是$\max\{e_{0,1},e_{1,0}\}$(可能是逆时针的大环,或是顺时针的大环,不可能同时出现否则会存在长度为$2$的环)。

  AC代码如下,时间复杂度为$O(n \log{n})$:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 
 4 const int N = 5e5 + 10;
 5 
 6 char s[N];
 7 int a[N], b[N];
 8 int e[3][3];
 9 
10 int main() {
11     scanf("%s", s);
12     int n = strlen(s);
13     for (int i = 0; i < n; i++) {
14         int t = 0;
15         if (s[i] == 'M') t = 1;
16         else if (s[i] == 'S') t = 2;
17         a[i] = b[i] = t;
18     }
19     sort(b, b + n);
20     for (int i = 0; i < n; i++) {
21         e[a[i]][b[i]]++;
22     }
23     int ret = 0;
24     for (int i = 0; i < 3; i++) {
25         ret += e[i][i];
26         for (int j = i + 1; j < 3; j++) {
27             int t = min(e[i][j], e[j][i]);
28             ret += t;
29             e[i][j] -= t, e[j][i] -= t;
30         }
31     }
32     ret += max(e[0][1], e[1][0]);
33     printf("%d", n - ret);
34     
35     return 0;
36 }

  可以开个哈希表用计数排序优化,时间复杂度就降到了$O(n)$。AC代码如下:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 
 4 const int N = 5e5 + 10;
 5 
 6 char s[N];
 7 int a[N], b[N];
 8 int e[3][3], cnt[3];
 9 
10 int main() {
11     scanf("%s", s);
12     int n = strlen(s);
13     for (int i = 0; i < n; i++) {
14         int t = 0;
15         if (s[i] == 'M') t = 1;
16         else if (s[i] == 'S') t = 2;
17         a[i] = t;
18         cnt[t]++;
19     }
20     for (int i = 0, k = 0; i < 3; i++) {
21         for (int j = 0; j < cnt[i]; j++){
22             b[k++] = i;
23         }
24     }
25     for (int i = 0; i < n; i++) {
26         e[a[i]][b[i]]++;
27     }
28     int ret = 0;
29     for (int i = 0; i < 3; i++) {
30         ret += e[i][i];
31         for (int j = i + 1; j < 3; j++) {
32             int t = min(e[i][j], e[j][i]);
33             ret += t;
34             e[i][j] -= t, e[j][i] -= t;
35         }
36     }
37     ret += max(e[0][1], e[1][0]);
38     printf("%d", n - ret);
39     
40     return 0;
41 }

 

参考资料

  AcWing 5198. 整理书籍(秋季每日一题2023):https://www.acwing.com/video/4931/

标签:10,int,样例,ret,++,整理,长度,书籍
From: https://www.cnblogs.com/onlyblues/p/17681964.html

相关文章

  • tensorflow 数据及操作整理
     目录:#1.类型#2.基础操作#3.运算相关#4.求导相关数据类型:###############################标量(0维数组)、#向量(1维数组)、#矩阵(2维数组)#张量(Tensor),概念上等同于多维数组 #1.类型#定义一个随机数(标量)random_float=tf.random.uniform(s......
  • springCloud学习笔记整理
    springCloud学习笔记整理1.分布式分布式的概念:根据业务功能对系统做拆分,每个业务功能模块作为独立项目开发,称为一个服务。分布式架构的优缺点:优点:降低服务耦合有利于服务升级和拓展缺点:服务调用关系错综复杂2.微服务微服务的上述特性其实是在给分布式架构制......
  • Java 十大必读经典书籍推荐
    今天给大家推荐十本学习Java语言必读经典书籍,它们经过了无数人的口口相传,都已成为了Java领域顶级的经典名著。 1、Java核心技术·卷I·基础知识豆瓣评分:9.4Java领域极有影响力和价值的著作之一,与《Java编程思想》齐名,10余年全球畅销不衰,广受好评。本书由拥有20多年......
  • 数字证书常见格式整理
    数字证书常见标准符合PKIITU-TX509标准,传统标准(.DER.PEM.CER.CRT)符合PKCS#7加密消息语法标准(.P7B.P7C.SPC.P7R)符合PKCS#10证书请求标准(.p10)符合PKCS#12个人信息交换标准(.pfx*.p12)X509是数字证书的基本规范,而P7和P12则是两个实现规范,P7用于数字信封,P12则是带......
  • SpringCloud知识点整理
         ......
  • Linux 干货整理(持续更新)
    博客地址:https://www.cnblogs.com/zylyehuo/如果虚拟机开机没有ip怎么办1.vim编辑网卡配置文件,修改如下参数[root@s25linuxtmp]#cd/etc/sysconfig/network-scripts/vim修改此文件,找到如下参数,改为yesONBOOT="yes"2.确保vmware正确选择了桥接或是NAT,且已经连接上......
  • 【行测】经典错题整理
    战国宋玉《对楚王问》,很早就点出“阳春白雪”与“下里巴人”之间的差别,然而在我们的文化传统里,并不认为“阳春白雪”有资格鄙薄“下里巴人”。精英文化与平民文化并不对抗,白居易作诗追求通俗浅白,“每作诗,令老妪解之”,只有老太婆能听懂的才是好诗;柳永用俚词俗语,“凡有井水饮处,皆能......
  • 书籍叠放
    题目描述书籍的长、宽都是整数对应[l,w](长,宽)。如果书A的长宽度都比B长宽大时,则允许将B排列放在A上面。现在有一组规格的书籍,书籍叠放时要求书籍不能做旋转请计算最多能有多少个规格书籍能叠放在一起输入描述输入:books=[[20,16],[15,11],[10,10],[9,10]]说明:总共有4......
  • Playwright轻松保存抓取的内容,快速整理数据
    作为一名爱好编程的程序员,你是否曾经遇到过需要抓取网页上的数据却无从下手的情况?Playwright是一款优秀的自动化测试工具,可以帮助你轻松地抓取网页上的内容,并且还可以将抓取到的数据进行保存。本文将详细介绍如何使用Playwright保存抓取的内容,希望对大家有所帮助。一、安装Playwr......
  • 系统集成项目管理工程师-笔记整理
    项目管理 项目立项-项目可行性研究1.项目建议书应包括的核心内容1)项目的必要性2)项目的市场预测3)产品方案和服务的市场预测4)项目建设的必要条件项目的风险预测及应对措施 属于项目启动后的风险管理1.     项目可行性研究内容 详细到每个1)投资的必要性2)技术的可行性......