求助!!!
查看原帖
求助!!!
959499
kk_account楼主2024/12/12 19:58

大概思路是找所有连续1的序列长度的一半作为这个牛群的最大天数(不完全是一半),就像这样:

if(g[i]%2==0)
 {
  xiao=min(xiao,g[i]/2-1);
 }
 else
 {
    xiao=min(xiao,g[i]/2);
 }

然后通过一个函数求出不同长度的序列1下,在前面算出的xiao的约束下的最初感染的牛数量,就想这样:

int find(int x)
{
    if(xiao==0)
    {
        return x;
    }
    if(x-2*xiao-2<=xiao)
    {
        return 2;
    }
    else
    {
        return 2+(x-2*xiao-2)/(xiao+1);
    }
}

然后相加即可 (语文较差,附代码如下,忽略注释掉的调试代码)

#include<iostream>
#include<cmath>
#include<vector>
#include<string>
using namespace std;
string ac;
int n,ans;
int xiao=2147483647;
int a[300005];
vector<int>g;
int find(int x)
{
//    if(findd[x]!=0)
//    {
//        return findd[x];
//    }
    if(xiao==0)
    {
        return x;
    }
    if(x-2*xiao-2<=xiao)
    {
        return 2;
    }
    else
    {
        return 2+(x-2*xiao-2)/(xiao+1);
    }
}
int solve()
{
    for(int i=0;i<g.size();i++)
    {
        ans+=find(g[i]);
    }
    return ans;
}
int main()
{
    cin>>n;
    cin>>ac;
    int vis=1;
    for(int i=1;i<=n;i++)
    {
        a[i]=ac[i-1]-'0';
        if(a[i]==0)
        {
            vis=0;
        }
    }
//    for(int i=1;i<=n;i++)
//    {
//        cout<<a[i]<<" ";
//    }
    if(vis==1)
    {
        cout<<1<<endl;
        return 0;
    }
    int qi=1;
    for(int i=1;i<=n;i++)
    {
        if(a[i]==0&&a[i+1]==1)
        {
            qi=i+1;
        }
        if(a[i]==1&&a[i+1]==0)
        {
            g.push_back(i-qi+1);
        }
    }
    for(int i=0;i<g.size();i++)
    {
        if(g[i]%2==0)
        {
            xiao=min(xiao,g[i]/2-1);
        }
        else
        {
            xiao=min(xiao,g[i]/2);
        }
    }
    for(int i=0;i<g.size();i++)
    {
        cout<<g[i]<<" ";
    }
    //cout<<xiao<<endl;
    cout<<solve()<<endl;
}
2024/12/12 19:58
加载中...