NOIP2012模擬10 25 旅行

2021-07-22 09:14:30 字數 1115 閱讀 3070

給定乙個n行m列的字元矩陣,』.』代表空地,』x』代表障礙。移動的規則是:每秒鐘以上下左右四個方向之一移動一格,不能進入障礙。

計算:在空地中隨機選擇起點和終點(可以重合,此時最短耗時為0),從起點移動到終點最短耗時的平均值。

每一行每一列至多有1個障礙,並且障礙不在對角線方向相鄰。以下矩陣是不合法的:

.x x.

第一行兩個整數n, m。

接下來n行,每行m個字元』.』或』x』。

平均耗時,保留4位小數,四捨五入。

2 2

.. .x

0.8889

2<=n,m<=1000

我在比賽時大膽的提出了乙個猜想:任意兩個點的距離都是他們的曼哈頓距離

然而被推翻了,但是我不知道如何改進我的猜想

於是就放棄了……

實際上猜想差不多是對的,乙個x和它左右比它高的x隔開的東西和這個x下面的東西距離為曼哈頓距離+2,只繞一下,然後就沒了

#include

#include

#include

#define db double

#define ll long long

#define fo(i,a,b) for(ll i=a;i<=b;i++)

#define n 1010

#define abs(x) ((x)<0?-(x):(x))

using

namespace

std;

int a[n][n];

db ans=0,l[n],h[n],h1[n],l1[n],tot,n,m;

int main()

scanf("\n");

}fo(i,1,n) fo(j,i,n) ans+=(h1[i]*h1[j]*(j-i)*2.0)/tot/tot;

fo(i,1,m) fo(j,i,m) ans+=(l1[i]*l1[j]*(j-i)*2.0)/tot/tot;

fo(i,1,m)

if(l[i]<214748347)

fo(i,1,n)

if(h[i]<214748347)

printf("%.4lf\n",ans);

}

NOIP2012模擬10 25 剪草

首先分析的出兩個結論,1 每棵草最多隻剪一次 2 按照生長速度,先剪小的,再剪大的。不難證明,略。那麼把小草按生長速度從大到小排個序後,設f i,j 表示,在倒數第i個時刻,已經處理了j棵草時的最小高度和。轉移為f i j min f i j 1 f i 1 j 1 a j g a ns i 1 a...

NOIP2012模擬10 25 旅行

給定乙個n行m列的字元矩陣,代表空地,x 代表障礙。移動的規則是 每秒鐘以上下左右四個方向之一移動一格,不能進入障礙。計算 在空地中隨機選擇起點和終點 可以重合,此時最短耗時為0 從起點移動到終點最短耗時的平均值。每一行每一列至多有1個障礙,並且障礙不在對角線方向相鄰。以下矩陣是不合法的 xx.50...

NOIP2012模擬10 25 剪草

有n棵小草,編號0至n 1。奶牛bessie不喜歡小草,所以bessie要用剪刀剪草,目標是使得這n棵小草的高度總和不超過h。在第0時刻,第i棵小草的高度是h i 接下來的每個整數時刻,會依次發生如下三個步驟 1 每棵小草都長高了,第i棵小草長高的高度是grow i 3 bessie計算一下這n棵小...