有四种情况:
1.把2个1放在两个不同的区间
2.把2个1放在同一个区间
3.把2个1分别放在头和尾
4.之间输出
#include
#include
using namespace std;
int n,m,maxx1,maxx2,x,y,k=1000100;
char c;
int a[100100];
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){
k=min(k,a[m]-a[m-1]);
if(a[m]-a[m-1]>=maxx1){
maxx2=maxx1;
maxx1=a[m]-a[m-1];
}
else maxx2=max(maxx2,a[m]-a[m-1]);
}
}
}
x=min(maxx1/2,maxx2/2);
y=maxx1/3;
if(a[1]>1){
x=max(x,min(a[1]-1,maxx1/2));
y=max(y,(a[1]-1)/2);
}
if(a[m]<n){
x=max(x,min(n-a[m],maxx1/2));
y=max(y,(n-a[m])/2);
}
int z=0;
if(a[1]>1&&a[m]<n)z=min(a[1]-1,n-a[m]);
if(m==0)cout<<n-1;
else cout<<min(k,max(x,max(y,z)));
return 0;
}
我们求出每个被感染的牛和它最近的被感染的牛的距离
爆力出奇迹
#include
#include
#include
using namespace std;
int m,n,k;
struct node{
int x,y,z,flag;
}a[1001];
bool cmp(node x,node y){
return x.x<y.x;
}
int main(){
freopen("socdist2.in","r",stdin);
freopen("socdist2.out","w",stdout);
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i].x>>a[i].y;
a[i].z=10001001;
}
sort(a+1,a+1+n,cmp);
for(int i=1;i<=n;i++){
for(int j=1;j<i;j++){
if(a[i].y==1){
a[j].z=min(a[j].z,a[i].x-a[j].x);
}
if(a[j].y==1){
a[i].z=min(a[i].z,a[i].x-a[j].x);
}
}
}
int r=10010000,ans=0;
for(int i=1;i<=n;i++){
if(a[i].y==0)r=min(r,a[i].z-1);
}
for(int i=1;i<=n;i++){
if(a[i].y==1){
for(int j=i-1;j>=1;j--){
if(a[i].x-a[j].x>r)break;
if(a[j].flag){
a[i].flag=1;
break;
}
}
if(a[i].flag==0){
a[i].flag=1;
ans++;
}
}
}
cout<<ans;
return 0;
}
loading……