本文共 2663 字,大约阅读时间需要 8 分钟。
此题太细节了,虽然我想了2小时
但考试时还是很多地方没想到
所以只得了 26.7 p t s 26.7pts 26.7pts
其实我们只需要用数学思维总结出四条通用规律,就能避免一堆的特判了!
A C C o d e AC~Code AC Code
#include<algorithm>#include<iostream>#include<cstring>#include<cstdio>#include<cmath>using namespace std;int n,m,maxn1,maxn2,x,y,zhz=2147483647;int a[100100],js;char c;int main(){ freopen("socdist.in","r",stdin); freopen("socdist.out","w",stdout); cin>>n; for(int i=1; i<=n; i++) { cin>>c; if(c=='1') { m++,a[m]=i; if(m>1) { zhz=min(zhz,a[m]-a[m-1]); if(a[m]-a[m-1]>=maxn1) { maxn2=maxn1; maxn1=a[m]-a[m-1]; } else maxn2=max(maxn2,a[m]-a[m-1]); } } } x=min(maxn1/2,maxn2/2),y=maxn1/3; //不同情况不同做法 if(a[1]>1) { x=max(x,min(a[1]-1,maxn1/2)); y=max(y,(a[1]-1)/2); } if(a[m]<n) { x=max(x,min(n-a[m],maxn1/2)); y=max(y,(n-a[m])/2); } if(a[1]>1&&a[m]<n) js=min(a[1]-1,n-a[m]); if(m==0) cout<<n-1; else cout<<min(zhz,max(x,max(y,js))); return 0;}
本题我没有很仔细地想
但其实 O ( n ) O(n) O(n)扫一遍就可以过
先把没感染的牛存下来,然后枚举他们, l l l和 r r r从枚举的位置开始向两边扩展,直到遇到一个被感染的牛,
r = m i n ( r , m i n ( 当 前 牛 的 位 置 − l , r − 当 前 牛 的 位 置 ) r=min(r,min(当前牛的位置−l,r−当前牛的位置) r=min(r,min(当前牛的位置−l,r−当前牛的位置)
算出 r r r后我们枚举每一个点(利用分块思想),
最后输出ans就行了
#include<algorithm>#include<iostream>#include<cstring>#include<cstdio>#include<cmath>using namespace std;int maxn,minn=2147483647,tj=2147483647;int n,x,y,r,l,pd,j,ans;int a[1000010],b[1010];int main(){ freopen("socdist2.in","r",stdin); freopen("socdist2.out","w",stdout); cin>>n; for(int i=1; i<=n; i++) { scanf("%d%d",&x,&y); if(y==1) a[x]=2; if(y==0) { a[x]=1; b[++j]=x; } maxn=max(maxn,x); minn=min(minn,x); } sort(b+1,b+1+j); for(int i=1; i<=j; i++) { l=b[i],r=b[i]; while(a[l]!=2) //分别向两边枚举,遇到被感染的牛才停下 { l--; if(l<minn) { l=-2147483647; break; } } while(a[r]!=2) { r++; if(r>maxn) { r=2147483647; break; } } tj=min(tj,min(b[i]-l,r-b[i])); //求 R } tj--; for(int i=minn; i<=maxn; i++) //分块思想求开始传播之前已经得病的奶牛的最小数量 { if(a[i]==2) { if(pd<=0) ans++; //一块结束后就答案++ pd=tj; } else pd--; } cout<<ans; return 0;}
考试时题目看的一头雾水
就放弃了,听了讲解后也不是很明白
还是等讲解回放吧!‘
A C C o d e AC~Code AC Code
这题要放到明天做
26.7 + 10 + 0 = 36.7 p t s 26.7+10+0=36.7pts 26.7+10+0=36.7pts
转载地址:http://dile.baihongyu.com/