P9975 [USACO23DEC] Cowntact Tracing 2 B
题解
1.如何取出位于序列结尾的连续特征子串:给结尾添加一个断点,位于序列开头的同理
2.对于所有感染牛群(即连续 \(1\) 子序列),无论最初感染牛有几头,位于哪里,感染牛群形成的时间是一样的
3.初始感染牛越少,同一感染牛群形成的时间就越长
4.对于任意不位于边界的感染牛群而言,最晚在第 \((len-1)/2\) 晚形成
5.所有牛群形成时间一致,所以所有牛群形成时间等于 \(min((len-1)/2)\)
6.一头牛,在第 \(i\) 晚最多可以感染 \(2·i+1\) 头牛,包括自己
7.虽然边界具有特殊性,但其也符合一般性的推导公式
code
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
char s[n+5];
cin>>(s+1);
s[0]='0';
s[n+1]='0';
int res=n,cnt=0;
vector<int> q;
for(int i=1;i<=n+1;i++)
{
if(s[i]=='1')cnt++;
else if(s[i]=='0'&&s[i-1]=='1')
{
if(i==n+1)
res=min(res,cnt-1);
else if(i==cnt+1)
res=min(res,cnt-1);
else res=min(res,(cnt-1)/2);
q.push_back(cnt);
cnt=0;
}
}
int ans=0;
for(auto it:q)
{
ans+=ceil(1.0*it/(2*res+1));
}
cout<<ans<<endl;
return 0;
}

浙公网安备 33010602011771号