1. 程式人生 > >[NOIP2012模擬10.25] 旅行 [構造]

[NOIP2012模擬10.25] 旅行 [構造]

給定一個n行m列的字元矩陣。’.’代表空地,’X’代表障礙。
每秒鐘可以往上下左右四個方向其中的一個移動一格(不能往障礙裡面撞)。
起點和終點可以在空地裡面隨機選擇(可以重合)。
求從起點移動到終點最短耗時的期望。
每一行、每一列至多有一個障礙。障礙不在對角線方向相鄰。 2 n , m

1 0 3 2\le n,m\le10^3
I n
p u t Input

第一行兩個整數n, m。
接下來n行,每行m個字元’.’或’X’。
O u t
p u t Output

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

E E 為空地數, P P 為障礙數
M i n D i s u , v E 2 \frac{\sum MinDis_{u,v}}{E^2}

當然不可能列舉 x 1 , y 1 , x 2 , y 2 x_1,y_1,x_2,y_2
解法有可能是列舉 x , y x,y 然後利用之前計算的結果

兩個點 u , v u,v 之間的最短距離大於它們的曼哈頓距離當且僅當在 x 1 , x 2 x_1,x_2 y 1 , y 2 y_1,y_2 之間有一串牆,它們的 x x 覆蓋了 x 1 x_1 ~ x 2 x_2 y y 覆蓋了 y 1 y_1 ~ y 2 y_2

會增加多少?
顯然當且僅當障礙長成
u· · ·
x· · ·
· · · ·
· x· ·
· · · ·
· · x·
· · · ·
· · · x
· · · v
橫過來也行, x x 之間距離大一點也行, u u v v 再上一點下一點也沒關係, x x 多幾列也好

然後用所有空地對的曼哈頓距離加上這些增加的部分就好了。
曼哈頓距離和是多少?
複雜的曼哈頓距離問題一般要分解為 x x 方向和 y y 方向的距離。
d i s u , v = Δ x + Δ y dis_{u,v}=\Delta x+\Delta y
列舉行 i , j i,j Δ y x y = i , x y = j = E y = i E y = j i j \sum \Delta y_{x_{y=i},x_{y=j}}=E_{y=i}*E_{y=j}*|i-j|
列舉列 i , j i,j Δ x y x = i , y x = j = E x = i E x = j i j \sum \Delta x_{y_{x=i},y_{x=j}}=E_{x=i}*E_{x=j}*|i-j|

增加了多少?
x 1 x_1 ~ x 2 x_2 間是否每個 x i x_i 都有一個障礙並且障礙的 y y 單調遞增或者遞減。
記錄一下具體是遞增還是遞減,障礙的 m i n y min_y m a x y max_y
然後就可以計算縱方向距離多 2 2 的點對數量了。
y y 同理。
考慮到同一行/列不能有兩個障礙,所以 x x y y 的答案不會有重複部分。
具體的實現從障礙來入手會方便得多。

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cctype>
#include<cstring>
#include<ctime>
using namespace std;
char ch=0;
double N,M,K=0;
double EmptyN[1005]={};
double EmptyM[1005]={};
double NPos[1005]={};
double MPos[1005]={};
bool Pt[1005][1005]={};
double Ans=0;
int main()
{
	scanf("%lf%lf ",&N,&M);
	for(int i=1;i<=N;++i)
	{
		while(ch!='.'&&ch!='X')ch=getchar();
		for(int j=1;j<=M;++j)
		{
			if(ch=='X')Pt[i][j]=1,NPos[i]=j,MPos[j]=i;
			else ++EmptyN[i],++EmptyM[j],++K;
			ch=getchar();
		}
	}
	for(int i=1;i<N;++i)
	for(int j=i+1;j<=N;++j)
	Ans+=2.0f*EmptyN[i]*EmptyN[j]*(j-i);
	
	for(int i=1;i<M;++i)
	for(int j=i+1;j<=M;++j)
	Ans+=2.0f*EmptyM[i]*EmptyM[j]*(j-i);
	
	for(int i=1;i<=N;++i)
    {
        if(!NPos[i])
            
           

相關推薦

[NOIP2012模擬10.25] 旅行 [構造]

給定一個n行m列的字元矩陣。’.’代表空地,’X’代表障礙。 每秒鐘可以往上下左右四個方向其中的一個移動一格(不能往障礙裡面撞)。 起點和終點可以在空地裡面隨機選擇(可以重合)。 求從起點移動到終點最短耗時的期望。 每一行、每一列至多有一個障礙。障礙不在對角線方向相鄰。

[NOIP2012模擬10.25] 剪草 [貪心+dp]

有N根草,編號0至N-1。任務是剪草,使N根草的高度和不超過H。 在第0時刻,第i棵小草的高度是h[i] 。 接下來的每個整數時刻,依次執行: (1)每根草i長高grow[i]。 (2)讓某根草高度歸零。注意:這棵小草並沒有死掉,它下一秒還會生長。 (3)計算N根草的高度和,若不超過

JZOJ 5925. 【NOIP2018模擬10.25】naive 的瓶子

題目 有 n 個瓶子,它們在桌子上排成一排。第 i 個瓶子的顏色為 ci,每次操作可以選擇兩個相鄰的瓶子,消耗他們顏色的數值乘積的代價將其中一個瓶子的顏色變成另一個瓶子的顏色。 現在要讓所以瓶子的顏色都一樣,操作次數不限,但要使得操作的總代價最小。 題解 比賽時看錯題了,看成

JZOJ 5926. 【NOIP2018模擬10.25】naive 的圖

題目 給定一個帶權無向圖。每個點都有它的顏色。定義 D ( s

JZOJ5925. 【NOIP2018模擬10.25】naive 的瓶子

Description 眾所周知,小 naive 有 n (n≤300)個瓶子,它們在桌子上排成一排。第 i 個瓶子的顏色為 ci,每個瓶子都有靈性,每次操作可以選擇兩個相鄰的瓶子,消耗他們顏色的數值乘積的代價將其中一個瓶子的顏色變成另一個瓶子的顏色。 現在 naive 要讓所以瓶子的顏

[Luogu1846] [NOIP2012模擬10.22] 遊戲 [dp]

link 先ai=ai−1,bi=bi−1\mathfrak{a_i=a_i-1,b_i=b_i-1}ai​=ai​−1,bi​=bi​−1 顯然數比較少的那一列,每個數都應該屬於不同的被運算元集合 考慮上面那一列怎麼做。 ab\mathfrak{ab}a

JZOJ-senior-5925. 【NOIP2018模擬10.25】naive 的瓶子

Time Limits: 2000 ms Memory Limits: 524288 KB Description 眾所周知,小 naive 有 n 個瓶子,它們在桌子上排成一排。第 i 個瓶子的顏色為 ci,每個瓶子都有靈性,每次操作可以選擇兩個相鄰的瓶子,

【JZOJ3059】【NOIP2012模擬10.26】雕塑【數論】【容斥】

題目大意: 題目連結:https://jzoj.net/senior/#main/show/3059 求 n ×

NOIP2012模擬10.31】擲骰子

Description 有兩個人在長度為N的數軸上走路。 每次每個人可以有相等的概率向前走1~m步。 如果超過N他會往回走(參考飛行棋) 先走到N的人贏。 現在先手在x,後手在y。 求先手贏

NOIP2012模擬10.29】排列 一題總結

題目大意:在n的全排列裡找出第k大的全排列並統計出在這個全排列裡有多少個數滿足這個數是Index數,且這個數所對應的下標位置也是Index數.(Index數是指這個數完全是由4和7組成的正整數) 分

JZOJ 3055. 【NOIP2012模擬10.27】比賽

hint main 概率 如果 clear con 進行 scrip 參加 題目 Description 有兩個隊伍A和B,每個隊伍都有n個人。這兩支隊伍之間進行n場1對1比賽,每一場都是由A中的一個選手與B中的一個選手對抗。同一個人不會參加多場比賽,

JZOJ 3056. 【NOIP2012模擬10.27】數字

define 個數字 表示 ring rain tput desc vector ++ 題目 Description 【問題描述】 一個數字被稱為好數字當他滿足下列條件: 1. 它有2*n個數位,n是正整數(允許有前導0)

2017-10-25模擬

open 貢獻 ans mod tro font operator owb 完成 T1 任務安排 容易發現 ans一定在0到min(s[i],t[i]) 的範圍內,二分這個最早時間,按著完成工作、 1 #include <algorithm>

2017.10.25 模擬

lose getchar() 前綴 query job fin argc apt it! 題目鏈接 T1 貪心或二分答案 #include <algorithm> #include <cstring> #include <cc

10.25 AHSOFNU 校內模擬

矩陣 font urn 決定 個人 logs 暴力 數據 scan //今天泉七考我們的題 感覺大家都很巨大啊~ 切題(problem) 【問題描述】  小 Z 和小 G 都是切題好手,他們經常搶著切題,今天他們已經 決定好了 n 道要切的題目並準備按照順序切掉這些題。

10.25模擬

space 其他 char s 很難 pytho getc script rip 遊戲 NP(np) Description LYK 喜歡研究一些比較困難的問題, 比如 np 問題。 這次它又遇到一個棘手的 np 問題。 問題是這個樣子的: 有兩個數 n 和 p, 求 n

[NOIP2018模擬10.25]瞎搞報告

情況 read 要求 ati 大小 樹狀 ... void 兩個 閑扯 最近有點頹,都修到好晚,早上起來和吔shi一樣難受 忍著困意把題面看完,發現啥也不會,又是一場寫暴力的模擬賽 T1發現似乎可以DP,順手碼了個 T2像個最小瓶頸路板子,但是只做過N^2算法的... T3

【NOIP2018模擬賽2018.10.25 B組】

此題爆零。原因不知道可以因費馬小定理推出 b' = b MOD p。 可以看出,f(u,p) = v 在這道題裡面意思就是 v = u MOD p,由於p是一個質數,那麼可以知道所有的a[i]等價於a[i] % p,所有的b[i]等價於b[i] % (p-1) 懶得講部分分 

2018-10-25 模擬測試題解

目錄 問題 A: 魏傳之長阪逆襲 題目描述 輸入 輸出 樣例輸入 樣例輸出 題解 問題 B: 蜀傳之單刀赴會 題目描述 【問題描述】 輸入 輸出 樣例輸入 樣例輸出 題解

[jzoj]2938.【NOIP2012模擬8.9】分割田地

script 連通 分配 mathjax cnblogs 沒有想到 -1 str 需要 Link   https://jzoj.net/senior/#main/show/2938 Description   地主某君有一塊由2×n個柵格組成的土地,有k個