小南的“绝绝子”时刻:翻眼流口水流眼泪,原来是这般滋味!

核心内容摘要

《男女一起愁愁愁》:一场笑中带泪的人生共鸣,高清全集让你一次看个够!
刘亦菲B站视频播放量

偷看76个美女撒尿

先看题目题目分析我们有一个长度为的二进制字符串包含字符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(

; int n; string s; cin n s; // 收集所有1的位置 vectorint pos; for (int i 0; i n; i) { if (s[i]

{ pos.push_back(i

; // 转成1-based } } int cnt pos.size(); // 1的个数 // 计算q数组 vectorlong long q(cnt); for (int i 0; i cnt; i) { q[i] pos[i] - i; // 公式推导q_j p_j - (j-

在代码中简化为 pos[i] - i } // 排序取中位数 sort(q.begin(), q.end()); long long mid q[cnt / 2]; // 计算总距离 long long ans 0; for (auto x : q) { ans abs(x - mid); } cout ans endl; return 0; }全剧终

咬小头头蘑菇视频免费观看-咬小头头蘑菇视频免费观看应用

百度百家号客服电话人工服务

123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123