您的位置:首页 > 大数据 > 人工智能

2016 Multi-University Training Contest 1 T3

2016-07-21 12:00 477 查看
题目要求出所有合法点对间的最短路径的平均值,因此我们应当求出所有合法最短点对的最 短路径之和,再除以合法点对个数。

题目中Guard之间有着很不自然的制约关系,每个Guard的周围和同行、列都不能有其余的 Guard,但不可路过的格子却只有本身一格。由此发现,任意两点间的最短路径只会至多被 一个Guard所干扰。

我们可以先算出没有Guard制约的所有最短路径长度之和,再分别对于每个 Guard求出必须经过他的点对个数,原本必须经过它的最短路要多绕两格。

对于第i行每个#点,他对于上面第j行的每个#点在纵坐标路径长度的贡献是abs(i-j),列也一样。然后就可以o(n*m)的算出路径和。

对于G点,和他在同一列的和不同列的可以分开算。

#include<cstring>
#include<cstdio>
#define mem(a) memset(a,0,sizeof(a))
int gl[1100],gh[1100],_,i,j,n,m;
double x,sum,ans,numl[1100],numh[1100],p;
char c[1100][1100];
int main()
{
//freopen("1.in","r",stdin);    freopen("1.out","w",stdout);
scanf("%d",&_);
while (_--)
{
sum=0;
mem(numh);mem(numl);mem(gl);mem(gh);
scanf("%d%d",&n,&m);
for (i=1;i<=n;i++)
{
scanf("%s",c[i]+1);
for (j=1;j<=m;j++)
{
if (c[i][j]=='#')
{
sum+=1;
numl[j]+=1;
numh[i]+=1;
}
else
{
gl[j]=i;
gh[i]=j;
}
}
}
ans=0;sum=sum*sum;
for (i=1;i<=n;i++)
{
for (j=1;j<i;j++)
{
x=(i-j)*numh[j]/sum;
ans+=x*numh[i];
}
for (j=i+1;j<=m;j++)
{
x=(j-i)*numh[j]/sum;
ans+=x*numh[i];
}
}
for (i=1;i<=m;i++)
{
for (j=1;j<i;j++)
{
x=(i-j)*numl[j]/sum;
ans+=x*numl[i];
}
for (j=i+1;j<=m;j++)
{
x=(j-i)*numl[j]/sum;
ans+=x*numl[i];
}
}
for (i=1;i<=n;i++)
for (j=1;j<=m;j++)
if(c[i][j]=='G')
ans+=((i-1)*(n-i)*4+(j-1)*(m-j)*4)/sum;

for (j=2;j<=n;j++){
if (gh[j-1]==0 || gh[j]==0) continue;
if (gh[j-1]<gh[j]){
p=(gh[j-1]-1)*(m-gh[j])/sum;
for (i=j-2;i>0;i--){
if (gh[i]==0 || gh[i]>gh[i+1]) break;
p+=1.0*(gh[i]-1)*(m-gh[j])/sum;
}
}else {
p=(m-gh[j-1])*(gh[j]-1)/sum;
for (i=j-2;i>0;i--){
if (gh[i]==0 || gh[i]<gh[i+1]) break;
p+=(m-gh[i])*(gh[j]-1)/sum;
}
}
ans+=4.0*p;
}
for (j=2;j<=m;j++){
if (gl[j-1]==0 || gl[j]==0) continue;
if (gl[j-1]<gl[j]){
p=(gl[j-1]-1)*(n-gl[j])/sum;
for (i=j-2;i>0;i--){
if (gl[i]==0 || gl[i]>gl[i+1]) break;
p+=(gl[i]-1)*(n-gl[j])/sum;
}
}else {
p=(n-gl[j-1])*(gl[j]-1)/sum;
for (i=j-2;i>0;i--){
if (gl[i]==0 || gl[i]<gl[i+1]) break;
p+=(n-gl[i])*(gl[j]-1)/sum;
}
}
ans+=4.0*p;
}

printf("%.4f\n",ans);
}
return 0;
}


View Code
Run IDSubmit TimeJudge StatusPro.IDExe.TimeExe.MemoryCode Len.LanguageAuthor
176528722016-07-20 19:02:27Accepted5725717MS2528K2012 BG++lbz007
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: