为什么A题wa了,思路和题解差不多只是没用二分用了预处理
代码如下
#include<string>
#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
#define ll long long
const int N = 1e6+5;
ll n,k,w,q;
string s;
struct node
{
ll l,r;
}p[N];
void solve()
{
ios::sync_with_stdio(false);
cin>>n>>s>>k>>w>>q;
s.insert(s.begin(),'1');//使下标从1开始
ll Id = 0;
for(int i=1;i<=n;i++)//记录第i天之前最近的没有比赛的天数编号,可能是自己
{
if(s[i]=='0')Id = i;
p[i].l = Id;
}
Id = 0;
for(int i=n;i>=1;i--)//同理记录第i天之后的
{
if(s[i]=='0')Id = i;
p[i].r = Id;
}
ll ans = 0;
for(int i=1;i<=n;i++)//枚举第二针
{
if(s[i]=='1')continue;
ll sum1=0,sum2=0,res1=0,res2=0,id;
id = min(i+k,n);//最优第三针,防止id大于n
if(id>i)//第三针
{
if(p[id].r)sum1 = max(sum1,w-(p[id].r-id)*q);
if(p[id].l>i)sum2 = max(sum2,w-(id-p[id].l)*q);
res1 = max(sum1,sum2);
}
sum1=0,sum2=0;
id = max(i-k,1ll*1);//最优第一针,防止id为负数
if(id<i)//第一针
{
if(p[id].r&&p[id].r<i)sum1 = max(sum1,w-(p[id].r-id)*q);
if(p[id].l)sum2 = max(sum2,w-(id-p[id].l)*q);
res2 = max(sum1,sum2);
}
ans = max(ans,res1+res2);
}
cout<<ans;
}
int main()
{
solve();
return 0;
}
