大概思路是找所有连续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;
}