洛谷P11361 [NOIP2024] 编辑字符串

news/2024/12/1 14:39:07/文章来源:https://www.cnblogs.com/yiweixxs/p/18579776

Problem



Solve

首先任意更换相邻元素任意次等同于在可交换范围内随便移动
这题是求最优解,直观想到DP和贪心,但是容易反应过来本题DP的话很难做到无后效性,且状态较多,故尝试贪心
不难发现,我们从左往右遍历的某个时刻进行交换后所得到的局部最优解总是答案的一种方案的一部分
原因很简单,我们不会因为我们为了让当前的某一列相等而做出的调度导致更加坏的结果,我们所进行的调度都会做出贡献,所以不管怎么影响后面的操作,结果都不会比啥也不干还坏
大概思路有了,现在来讲一下实现:
把每个可以随意交换的区间导出来(两列可以一起混在一个地方记录),记录其中1和0的个数,无需记录范围
导出的过程中把每个格子所属于的区间记下来,这样就可以瞬间查询所属区间的0/1储备情况
然后开始遍历每一列,采取如下步骤:
如果这一列全都被固定,直接计算
如果有一列被固定,进行调度(比如当前格子(未固定)所属区间编号为x,该去年当前与固定的格子相同的有f[x][0]个,那么f[x][0]--)
如果都没固定,看看什么元素二者区间都有,然后进行调度,如果没有就拉倒
调度成功或者匹配成功就ans++
注意,没有固定的格子在导出区间之后我们就不关心它具体的值了,我们可以认为它一定是调度来的(先假设在别的地方,再回来)

Code

#include<bits/stdc++.h>
using namespace std;
int T,n;
int f[2][100005],col;
string a,b,s1,s2;
struct p{int x,y;int sum(){return x+y;}
};
vector<p> g;
void input(){g.clear();g.push_back({-1,-1});col=1;cin>>n;getline(cin,a);getline(cin,a);getline(cin,b);getline(cin,s1);getline(cin,s2);a="#"+a;b="#"+b;s1="#"+s1;s2="#"+s2;
}
void solve1(){int cx=0,cy=0;for(int i=1;i<=n;i++){if(s1[i]=='1'){if(a[i]=='1')cx++;else cy++;f[0][i]=col;}else{if(cx||cy){g.push_back({cx,cy});col++;cx=cy=0;}f[0][i]=0;}}if(cx||cy){g.push_back({cx,cy});col++;cx=cy=0;}for(int i=1;i<=n;i++){if(s2[i]=='1'){if(b[i]=='1')cx++;else cy++;f[1][i]=col;}else{if(cx||cy){g.push_back({cx,cy});col++;cx=cy=0;}f[1][i]=0;}}if(cx||cy){g.push_back({cx,cy});col++;cx=cy=0;}
}
int solve2(){int ans=0;for(int i=1;i<=n;i++){if(!f[0][i]&&!f[1][i])ans+=(a[i]==b[i]);else if(!f[0][i]){if(a[i]=='1'){if(g[f[1][i]].x)g[f[1][i]].x--,ans++;else g[f[1][i]].y--;}else{if(g[f[1][i]].y)g[f[1][i]].y--,ans++;else g[f[1][i]].x--;}}else if(!f[1][i]){if(b[i]=='1'){if(g[f[0][i]].x)g[f[0][i]].x--,ans++;else g[f[0][i]].y--;}else{if(g[f[0][i]].y)g[f[0][i]].y--,ans++;else g[f[0][i]].x--;}}else{if(g[f[0][i]].x&&g[f[1][i]].x){g[f[0][i]].x--;g[f[1][i]].x--;ans++;}else if(g[f[0][i]].y&&g[f[1][i]].y){g[f[0][i]].y--;g[f[1][i]].y--;ans++;}else{if(g[f[0][i]].x){g[f[0][i]].x--;g[f[1][i]].y--;}else{g[f[0][i]].y--;g[f[1][i]].x--;}}}}return ans;
}
int main(){cin>>T;while(T--){input();solve1();cout<<solve2()<<endl;}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/844568.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JVM学习-02-Java内存区域与内存溢出异常

第二章、Java内存区域与内存溢出异常2.1 概述介绍Java虚拟机内存的各个区域 讲解这些区域的作用、服务对象以及其中可能产生的问题2.2 运行时数据区域 2.2.1 运行时数据区域程序计数器:当前线程所执行的字节码的行号指示器,每条线程都需要有一个独立的程序计数器(线程私有)…

2024-2025-1 学号20241315《计算机基础与程序设计》第十周学习总结

作业信息这个作业属于哪个课程 2024-2025-1-计算机基础与程序设计这个作业要求在哪里 <作业要求的链接>(https://www.cnblogs.com/rocedu/p/9577842.html#WEEK10)这个作业的目标 信息系统 数据库与SQL 人工智能与专家系统 人工神经网络 模拟与离散事件 排队系统 天气与地…

计算机基础与程序设计第十周总结

学期(如2024-2025-1) 学号(如:20241300) 《计算机基础与程序设计》第X周学习总结 作业信息这个作业属于哪个课程 https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP这个作业要求在哪里 https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP/homework/13273这个作…

高级语言程序设计第九次个人作业

这个作业属于哪个课程:https://edu.cnblogs.com/campus/fzu/2024C 这个作业要求在哪里: https://edu.cnblogs.com/campus/fzu/2024C/homework/13311 学号:102400111 姓名:蔡伟仡 14.17.314.17.414.17.514.17.1014.17.1114.18.314.18.414.18.5总结与反思:熟悉枚举和共用体

20222412 2021-2022-2 《网络与系统攻防技术》实验七实验报告

20222412 2021-2022-2 《网络与系统攻防技术》实验七实验报告 1.实验内容 本实践的目标理解常用网络欺诈背后的原理,以提高防范意识,并提出具体防范方法。具体实践有 (1)简单应用SET工具建立冒名网站 SET工具是一款开源的社会工程学渗透测试工具,专门用于模拟各种社会工程…

2024-2025-1 20241411王思棋《计算机基础与程序设计》第十周学习总结

作业信息 |这个作业属于哪个课程|https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP| | -- |-- | |这个作业要求在哪里|https://www.cnblogs.com/rocedu/p/9577842.html#WEEK10| | 这个作业的目标|信息系统、数据库与SQL、人工智能与专家系统、人工神经网络、模拟与离散事…

2024-2025-1 20241421 刘庆安《计算机基础与程序设计》第十周学习总结

这个作业属于哪个课程 2024-2025-1-计算机基础与程序设计)这个作业要求在哪里 https://www.cnblogs.com/rocedu/p/9577842.html#WEEK10这个作业的目标 信息系统、数据库与SQL、人工智能与专家系统、人工神经网络、模拟与离散事件、排队系统、天气与地震模型、图形图像作业正文…

消费占GDP比重

import matplotlib.pyplot as plt from pylab import mpl# 设置matplotlib支持中文字体 mpl.rcParams["font.sans-serif"] = ["SimHei"] # Windows系统使用黑体 # mpl.rcParams["font.sans-serif"] = ["Arial Unicode MS"] # macOS系…

20241313 刘鸣宇 《计算机基础与程序设计》第十周学习总结

2024-2025-1 20241313 《计算机基础与程序设计》第十周学习总结 作业信息这个作业属于哪个课程 <班级的链接>(如2024-2025-1-计算机基础与程序设计)这个作业要求在哪里 <作业要求的链接>(如2024-2025-1计算机基础与程序设计第一周作业)这个作业的目标 <写上具…

同步时钟,异步时钟

synchronous & asynchronous 在静态时序分析中,有一个很重要的概念是同步和异步 如果 launch clock 与 capture clock 有固定的相位差,那就是同步时序 如果两者没有固定的相位差,那就是异步时序 一般情况下,STA 只检查同步时序,不用检查异步时序 同步时序又分为以下几…

Python数据爬取处理可视化,手把手全流程教学

这篇博客中,选取openjudge网站上“百练”小组中的用户答题数据,作为材料进行教学目录爬取主页面内容主页面内容提取需求数据爬取数据处理数据分析 网站地址:http://bailian.openjudge.cn/使用到的Python包:requests、pandas、re、BeautifulSoup、time、matplotlib、seaborn…

Nuxt.js 应用中的 render:island 事件钩子

title: Nuxt.js 应用中的 render:island 事件钩子 date: 2024/12/1 updated: 2024/12/1 author: cmdragon excerpt: 在 Nuxt.js 中,render:island 钩子允许开发者在构建“岛屿”HTML之前进行处理和修改。此钩子为实现复杂的客户端交互和动态内容提供了基本支持,特别适合与…