为什么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;
}


全部评论
最优解的第一针可能是负数
点赞 回复 分享
发布于 2022-02-12 12:59

相关推荐

递归到脑子变傻:杭州还有上位机用VB的,实在没绷住
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务