二分的好题。错了几次。关键是需要考虑周全,不然容易跪。。枚举以i(0
[cpp]
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long LL;
#define eps 10e-9
#define inf 0x3f3f3f3f
#define REP(i,n) for(int i=0; i<(n); i++)
const int maxn = 100000+100;
vector v[110];
char ma[110][10100];
int main(){
int n,m;
scanf("%d %d",&n,&m);
for(int i=0;i
scanf("%s",ma[i]);
}
for(int i=0;i
for(int j=0;j
if(ma[i][j]=='1'){
v[i].push_back(j);
}
}
if(v[i].size()==0) {
printf("-1\n");
return 0;
}
}
int ans=inf;
for(int i=0;i
int t_ans=0,right,left;
for(int j=0;j
int temp=lower_bound(v[j].begin(),v[j].end(),i)-v[j].begin();
if(temp
right=v[j][temp]-i;
else right=maxn;
right=min(right,v[j][0]+m-i);
left = m - v[j][ v[j].size()-1 ]+i;
if(temp<=0)
t_ans+=min(right,left);
else{
t_ans+=min(i-v[j][temp-1],min(right,left));
}
// printf("%d %d %d\n",i,right,left);
}
if(t_ans
}
printf("%d\n",ans);
return 0;
}