加油!!!
T1
此题太细节了,虽然我想了2小时
但考试时还是很多地方没想到
所以只得了
26.7
p
t
s
26.7pts
26.7pts
其实我们只需要用数学思维总结出四条通用规律,就能避免一堆的特判了!
- 把2个1放在两个不同的区间
- 把2个1放在同一个区间
- 把2个1分别放在头和尾
- 之间输出
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;
}
T2
本题我没有很仔细地想
但其实
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;
}
T3
考试时题目看的一头雾水
就放弃了,听了讲解后也不是很明白
还是等讲解回放吧!‘
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
总结
- 不能懒,题目一定要钻研
- 不要轻易放弃一道题