题解:AT_abc346_d [ABC346D] Gomamayo Sequence
思路
一眼
我们设
如果我们枚举
不如看一组样例:
01011101
如果我们把
01001010
如果把
01011010
会发现只有
同理,如果我们把
推广后,发现在整个序列都满足该定律,即改变
这样,我们只需要算出把
转移方程:
- 若
,则 , ; - 若
,则 , ;
就结束了。
Code
#include<bits/stdc++.h>
using namespace std;
long long f[200005][2];
int n,c[200005],a[200005],a1[200005],a0[200005];
string s;
int main(){
cin>>n>>s;
for(int i=1;i<=n;i++)cin>>c[i];
for(int i=0;i<s.length();i++){
a[i+1]=s[i]-'0';
}
a0[1]=0;a0[2]=0;
a1[1]=1;a1[2]=1;
for(int i=3;i<=n;i++){
if(a0[i-1]==0)a0[i]=1;
else a0[i]=0;
if(a1[i-1]==1)a1[i]=0;
else a1[i]=1;
}
long long sum0=0,sum1=0;
for(int i=1;i<=n;i++){
if(a0[i]!=a[i])sum0+=c[i];
if(a1[i]!=a[i])sum1+=c[i];
}
f[1][0]=sum0,f[1][1]=sum1;
for(int i=2;i<n;i++){
f[i][1]=f[i-1][0];
f[i][0]=f[i-1][1];
if(a[i]==0){
f[i][1]+=c[i];
f[i][0]-=c[i];
}
else{
f[i][1]-=c[i];
f[i][0]+=c[i];
}
}
long long ans=9223372036854775807;
for(int i=1;i<n;i++){
if(f[i][1]<ans)ans=f[i][1];
if(f[i][0]<ans)ans=f[i][0];
}
cout<<ans;
return 0;
}
分类:
题解
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】