华为OD机试 - 小朋友分组最少调整次数 - 贪心算法(Java 2024 E卷 200分)

一、题目描述

n (3 ≤ n ≤ 90000 且可以整除 3) 个学生排成一排,学生编号分别是 1 到 n,n 为 3 的整数倍数,老师随机抽签决定将所有学生分成 m 个 3 人的小组(n = 3 * m)。

为了便于同组学生交流,老师决定将小组成员安排到一起,也就是同组成员彼此相连,同组任意两个成员之间无其它组的成员。

因此老师决定调整队伍,老师每次可以调整任意一名学生到队伍的任意位置,计为调整了一次,请计算最少调整多少次可以达到目标。

注意:对于小组之间没有顺序要求,同组学生之间没有顺序要求。

二、输入描述

第一行输入初始排列顺序序列

第二行输入分组排列顺序序列

三、输出描述

输出一个整数k,表示至少调整k次。

四、测试用例

测试用例1:

1、输入

4 2 8 5 3 6 1 9 7
6 3 1 2 4 8 7 9 5

2、输出

1

3、说明

只有一个组(例如 [4,

题目描述: 给定一个仅由&#39;A&#39;、&#39;B&#39;、&#39;C&#39;三种字符组成的字符串S,请你计算最少需要修改多少个字符,才能使S满足其中任意相邻的两个字符都不同。 例如,如果 S = "ABABA",其中最少修改次数为1,即将最后一个&#39;A&#39;改为&#39;C&#39;,使得该串符合所要求的条件。 输入描述: 第一行输入一个整数T,表示有T组数据。接下来有T组数据,每组数据有一行字符串S,其中1 ≤ T ≤ 100,1 ≤ |S| ≤ 100。 输出描述: 每组数据输出一行,即修改次数的最小值。 思路析: 这是一道非常经典的题目。它的核心就是贪心算法。 由于只有三个字符,那么如果当前位置和前一个位置相同,那么将当前位置修改为与前一个位置不同的字符就可以了。记得改完之后,还需要更新当前位置,以便扫描下一个字符。 如果遇到了情况,需要将前一个字符和当前字符都修改,这是因为要满足任意两个相邻字符都不同的要求。 代码实现: 首先读入T组数据: int T; cin >> T; 接下来处理T组数据: while (T--) { string s; cin >> s; int cnt = 0; for (int i = 1; i < s.length(); ++i) { if (s[i] == s[i - 1]) { s[i] = s[i - 1] == &#39;A&#39; ? &#39;B&#39; : (s[i - 1] == &#39;B&#39; ? &#39;C&#39; : &#39;A&#39;); ++cnt; } if (i > 1 && s[i] == s[i - 2]) { s[i] = s[i - 2] == &#39;A&#39; ? &#39;B&#39; : (s[i - 2] == &#39;B&#39; ? &#39;C&#39; : &#39;A&#39;); ++cnt; } } cout << cnt << endl; } 完整代码:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哪 吒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值