核心内容摘要
计算机毕业设计springboot专业认è¯�æ•™å¦èµ„料综å�ˆç®¡ç�†ç³»ç»Ÿ 基äº�SpringBoot的工程教育认è¯�资料全生命周期管ç�†ç³»ç»Ÿ é«˜æ ¡å¸ˆèŒƒç±»ä¸“ä¸šè®¤è¯�æ•™å¦æ¡£æ¡ˆä¿¡æ�¯åŒ–æœ�务平å�°
先看题目题目分析我们有一个长度为的二进制字符串包含字符0和1至少有一个1。
可以交换相邻字符每次交换算一次操作。
目标让所有1连续排列形成一段连续的1。
求最少操作次数思路分析关键观察最终1聚集到连续的一段但我们可以自由选择这个连续段的位置。
我们只关心1的相对位置变化不关心0的具体分布除了它们会占用位置。
交换相邻字符相当于把一个1向左或向右移动一位。
把所有的1聚集到一起等价于把每个1移动到某个中心位置附近。
这其实是一个经典问题最小化所有1移动到连续位置的总交换次数。
转化为数学模型假设最终1的连续段是从位置 k 到位置 km−1其中 m 是1的个数。
设原字符串中1的位置下标从 1 开始是p1,p2,…,pm最终连续段的位置是k,k1,…,km−1那么把第 j 个1从 pj 移动到 kj−1 需要的交换次数就是总操作次数为我们要选择一个整数 k 使得这个和最小。
化简令 qjpj−(j−
那么上式变成其中 qj 是已知的常数因为 pj 已知。
所以问题转化为已知数组 q1,q2,…,qm找一个整数 k 使最小。
这是经典问题最小绝对偏差和当 k 取 q 的中位数时和最小。
因此先找出所有1的位置 p1,p2,…,pm。
计算 qjpj−(j−
。
对 q 数组排序取中位数。
计算这就是最小操作次数。
正解#include bits/stdc.h using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(