11.14 解题报告
T1
考场用时:
期望得分:
实际得分:
有一个地方的
对于
发现其实段数是没必要枚举的,直接压掉一维,复杂度
int dp[20001],st[20001][21][2],lg[MAX];
inline int w(int l,int r){
int len=lg[r-l+1];
int mn=min(st[l][len][0],st[r-(1ll<<len)+1][len][0]);
int mx=max(st[l][len][1],st[r-(1ll<<len)+1][len][1]);
return mx-mn;
}
signed main(){
int n=read(),m=read(),K=read();
for(int i=1;i<=n;i++) dp[i]=1e18;
for(int i=1;i<=n;i++) st[i][0][0]=st[i][0][1]=read();
lg[0]=-1;
for(int i=1;i<=n;i++) lg[i]=lg[i>>1]+1;
for(int i=1;i<=20;i++)
for(int j=1;j+(1ll<<i)-1<=n;j++){
st[j][i][0]=min(st[j][i-1][0],st[j+(1ll<<(i-1))][i-1][0]);
st[j][i][1]=max(st[j][i-1][1],st[j+(1ll<<(i-1))][i-1][1]);
}
dp[0]=0;
for(int j=1;j<=n;j++){
for(int k=max(0ll,j-m);k<j;k++)
dp[j]=min(dp[j],dp[k]+w(k+1,j)*(j-k)+K);
}
cout<<dp[n];
return 0;
}
T2
考场用时:
期望得分:
实际得分:
爆搜写假了,考虑贪心,对于若干个连续的
具体实现可以从头到尾扫一遍字符串,记录当前连续
char s[MAX];
signed main(){
int n=read();
scanf("%s",s+1);
int js=0,ans=0;
for(int i=1;i<=n;i++){
if(s[i]=='1') js++;
else{
if(js==1) ans++,js=0;
else if(js>1) ans++,js=1;
}
}
ans+=min(js,2ll);
cout<<ans;
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术