P16660 [GKS 2018 #H] Mural 题解
题目大意
有一块长度为 \(N\) 的墙,每一块段落如果给他涂色的话会获得一个美丽值,被毁坏的段落不能被绘制,被绘制的段落不能被毁坏。第一次可以选择任意段落进行绘制,在随后的每一次必须绘制与已绘制段落相邻的段落。第一次结束墙上的第一个或最后一个段落会被毁坏,随后被毁坏的段落与另一个被毁坏的段落相邻或在第一个或最后一个且未被毁坏。求最大的美丽值。
算法分析
推一下样例就能发现,无论如何,都能涂满长度为 \(\lceil \frac{n}2 \rceil\) 的任一连续段,所以前缀和枚举每一段长度为 \(\lceil \frac{n}2 \rceil\) 的连续段,取美丽值和最大值。
#include<bits/stdc++.h>
using namespace std;//参考代码
const int N=5e6+5;
int a[N],s[N];
int main(){
std::ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
int T,id=0;
cin>>T;
while(T--){
int n;
cin>>n;
for(int i=1;i<=n;i++){
char x;
cin>>x;
a[i]=x-'0';
s[i]=s[i-1]+a[i];//前缀和
}
int ans=0,len=(n+1)/2;//相当于向上取整
for(int i=1;i+len-1<=n;i++){
ans=max(ans,s[i+len-1]-s[i-1]);
}
cout<<"Case #"<<++id<<": ";
cout<<ans<<'\n';
}
return 0;
}

浙公网安备 33010602011771号