codeforces gym 100345I Segment Transformations [想法题]
题意简述
给定一个由A C G T四个字母组成的密码锁(每拨动一次 A变C C变G G变T T变A)
密码锁有n位 规定每次操作可以选取连续的一段拨动1~3次
问最少几次操作可以将初始状态变到末状态
并且把每次操作输出
(此题有spj)
---------------------------------------------------------------------------------------------------------
为了方便叙述 所有没有明确说明的位置均是在$mod4$意义下的
首先我们显然可以明白一个性质 操作顺序是没关系的
有关系的只是每个位置被拨动的次数
比赛的时候一开始想的是比较随意的贪心 然而是有反例的
最后剩下30min的时候 从数据范围想到了区间Dp
然而这题并不是一般的区间Dp
最小操作数好求然而操作方案难以记录
补题的时候 最终又去想象有没有什么更好的贪心思路
---------------------------------------------------------------------------------------------------------
我们用一个高度数组h记录从初始状态到末状态每个位置需要拨动的次数
比如样例
AGGTCAT
AAACTAA
高度数组h便是 0222201
我们再定义一个delta数组 代表所有的$h[i]-h[i-1]$
那么从$1$到$n+1$delta数组的值便是 02000213
(这样的构造类似与用树状数组维护区间加减值的做法 不过这种思想的具体名称我也不知道)
显然我们每次最优可以将两个2变为0 或者将一个1和一个3变为0
于是这样就可以做了?
然而只是这样做的话会RE11
---------------------------------------------------------------------------------------------------------
比如这样一个样例
AA
GT
高度数组h为 23
delta数组为 211
于是并不能找出两个2或者一个1一个3来配对消除
既然无法一次消两个 我们就一次消一个吧
不过显然是不能使一些已经消除的部分又出现
所以直接找两个非0的进行处理 把其中一个变为0就好了
(注意到delta数组之和为0 所以最后一定不会只剩下一个非0的)
#include <bits/stdc++.h>
using namespace std;
const int N=;
char s1[N],s2[N];
int h[N],delta[N],cnt[];
int L[N],R[N],d[N];
int n,ans;
int main()
{
#ifdef ONLINE_JUDGE
freopen("transform.in","r",stdin);
freopen("transform.out","w",stdout);
#endif
scanf("%s%s",&s1[],&s2[]);
n=strlen(&s1[]);
for(int i=;i<=n;++i)
{
if(s1[i]=='A')
h[i]=-;
else if(s1[i]=='C')
h[i]=-;
else if(s1[i]=='G')
h[i]=-;
else
h[i]=-;
if(s2[i]=='A')
h[i]+=;
else if(s2[i]=='C')
h[i]+=;
else if(s2[i]=='G')
h[i]+=;
else
h[i]+=;
h[i]=h[i]<?h[i]+:h[i];
}
for(int i=;i<=n+;++i)
{
delta[i]=(h[i]-h[i-]+)%;
cnt[delta[i]]++;
}
while(cnt[]!=n+)
{
++ans;
int i=;
while(!delta[i])
++i;
int j=i+;
while(delta[j]+delta[i]!=&&j<=n+)
++j;
if(j<=n+)
{
L[ans]=i;
R[ans]=j-;
d[ans]=delta[i];
cnt[delta[i]]--;
cnt[delta[j]]--;
cnt[]+=;
delta[i]=delta[j]=;
}
else
{
j=i+;
while(!delta[j])
++j;
L[ans]=i;
R[ans]=j-;
d[ans]=delta[i];
cnt[delta[i]]--;
cnt[delta[j]]--;
cnt[]++;
cnt[(delta[j]+delta[i])%]++;
delta[j]=(delta[j]+delta[i])%;
delta[i]=;
}
}
printf("%d\n",ans);
for(int i=;i<=ans;++i)
printf("%d %d %d\n",L[i],R[i],d[i]);
return ;
}
codeforces gym 100345I Segment Transformations [想法题]的更多相关文章
- Codeforces Gym 100431D Bubble Sort 水题乱搞
原题链接:http://codeforces.com/gym/100431/attachments/download/2421/20092010-winter-petrozavodsk-camp-an ...
- Codeforces Gym 100803D Space Golf 物理题
Space Golf 题目连接: http://codeforces.com/gym/100803/attachments Description You surely have never hear ...
- Codeforces gym 100685 C. Cinderella 水题
C. CinderellaTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100685/problem/C ...
- Codeforces GYM 100114 B. Island 水题
B. Island Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100114 Description O ...
- codeforces 657C - Bear and Contribution [想法题]
题目链接: http://codeforces.com/problemset/problem/657/C ----------------------------------------------- ...
- Codeforces Gym 100286G Giant Screen 水题
Problem G.Giant ScreenTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/con ...
- CodeForces - 156B Suspects 逻辑 线性 想法 题
题意:有1~N,n(1e5)个嫌疑人,有m个人说真话,每个人的陈述都形如X是凶手,或X不是凶手.现在给出n,m及n个陈述(以+x/-X表示)要求输出每个人说的话是true ,false or notd ...
- CodeForces - 798D Mike and distribution 想法题,数学证明
题意:给你两个数列a,b,你要输出k个下标,使得这些下标对应的a的和大于整个a数列的和的1/2.同时这些下标对应的b //题解:首先将条件换一种说法,就是要取floor(n/2)+1个数使得这些数大于 ...
- CodeForces - 55C Pie or die 想法题(猜程序)
http://codeforces.com/problemset/problem/55/C 题意:一个博弈. 题解:瞎猜,目前不清楚原理 #include<iostream> #inclu ...
随机推荐
- Spring cloud学习--Zuul01
Zuul解决的问题 作为系统的统一入口,屏蔽了系统内部各个微服务的细节 可以与微服务治理框架结合,实现自动化的服务实例维护以及负载均衡的路由转发 实现接口权限校验与微服务业务逻辑的解耦 搭建Zuul服 ...
- opencv2——直方图5
(一)图像直方图 图像的构成是有像素点构成的,每个像素点的值代表着该点的颜色(灰度图或者彩色图).所谓直方图就是对图像的中的这些像素点的值进行统计,得到一个统一的整体的灰度概念.直方图的好处就在于可以 ...
- C# 字符串Trim进阶
private void button1_Click(object sender, EventArgs e) {//去掉字符串头尾指定字符 string MyInfo= "--中华人民共和国 ...
- 一个神奇却很简单的css特效
在网上看到一个前端大牛的主页,觉得他有一个特效特别酷,一开始还以为是要用什么javascript代码来实现,但仔细看一下,发觉只是用几行css代码就搞定了,我觉得挺好的. 他这个效果就是鼠标放在左半部 ...
- idea 创建 SSM + maven Java Web 项目流程
idea 创建 SSM + maven Java Web 项目流程 一.idea 中选择File,New Project 新建项目 二.选择Maven,勾选上面的Create from archety ...
- vue项目build打包后图片路径不对导致图片空白不显示问题解决方法
1.在上篇文章src配置及引入的基础上修改项目配置: 文章链接地址:https://www.cnblogs.com/hsl-shiliang/p/10333022.html. 2.具体配置过程如图: ...
- MySQL--10 日志简介
目录 一.MySQL日志简介 二.错误日志 三.一般查询日志 四.二进制日志 五.慢查询日志 一.MySQL日志简介 二.错误日志 作用: 记录mysql数据库的一般状态信息及报错信息,是我们对于数据 ...
- MySQL系列之二四种隔离级别及加锁
事务 1.定义:所有操作必须成功完成,否则在每个操作中所作的所有更改都会备撤销. 2.事务的ACID 原子性atomicity 一致性consistency 隔离性isolation 持续 ...
- spring整合消息队列rabbitmq
ps:本文只是简单一个整合介绍,属于抛砖引玉,具体实现还需大家深入研究哈.. 1.首先是生产者配置 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ...
- [Luogu2170]选学霸
这一道题,由于他说,"如果实力相当的人中,一部分被选上,另一部分没有,同学们就会抗议."而要求"既不让同学们抗议,又与原来的M尽可能接近".因此,我们要对实力相 ...