bzoi3038 關燈(模擬)

2021-08-04 05:18:30 字數 1980 閱讀 2273

時間限制: 1 sec  記憶體限制: 128 mb

穀倉是乙個簡單的多邊形。它的每一條邊或平行於x軸,或平行於y軸。從任意乙個點沿順時針方向走,橫邊和縱邊是交替出現的。多邊形一共有n個點,編號為1到n。其中1號點為出口。奶牛貝西已經完全記住了穀倉的地圖。它從某乙個點出發,只能沿著邊界走,在開燈的情況,它能很快知道怎麼走才能更快到達出口。可是有一天,燈熄滅了。它一下慌了神,然後它忘了自己在哪個點了。但是幸運的是它仍然記得整個穀倉的地圖,而且它能夠憑觸覺知道當前點的內角有多大,它也能感覺到當前點是不是出口,而且經過一條邊後也能精確地計算出該邊的長度。現在,為了尋找出口,它決定採取這樣的策略:沿著順時針方向繼續走下去,直到它能夠判斷出自己的位置,然後再選擇距離最短的方向(順時針或逆時針)走到出口。求最壞的情況下,貝西走到出口要比燈沒壞的情況下多花多少時間。

第一行包含n(4<=n<=200),接下來n行每行包含兩個整數,表示多邊形的n個頂點(xi,yi),按順時針的方向給出。這些點的範圍均在[-100000,100000]

輸出貝西按照上述策略在最壞情況下比正常情況下要多花的時間。

4

0 00 10

1 10

1 0

2

貝西如果在出口處,肯定可以感知到,這絕對不會是最壞情況。現在考慮它在其他3個點時的情形:它當前可以感知到內角的大小。但因為內角都是90度,所以他無法確定自己位置。於是它按照既定的策略,順時針走:

1. 如果它在開始在點2,它需要走到點3,此時,它知道自己在**了。於是它找最短的路徑,不管哪邊,都是11.所以,它一共需要走12個單位。如果是開燈的情況下,只需要走10個單位。所以,它要多走兩個單位。

2. 如果它在點3,它要走11個單位。開燈的情況下也要走11個單位。

3. 如果它在點4,它要走1個單位。開燈的情況下也要走1個單位。

於是最壞的情況下,它要多走兩個單位。

這題其實很有意思,關鍵在判斷怎樣才算是知道自己在**了。

對每個內角用叉乘判斷角度並標號(我的處理應該是麻煩了,可以不用把邊和點連起來的,分開存就行了)。

凡是奶牛走過的,都將成為它能夠獲知的資訊(判斷依據),也就是說走過的路和角度按照順序都成為新的雜湊標準。

然後就是模擬了。

雜湊用vector + map比較好寫,具體見**

code:

#include#include#include#include#include#include#includeusing namespace std;

const int max = 200;

struct nodel[max + 5];

int n;

int x[max + 5], y[max + 5];

int dis[2][max + 5];

map, int>hash;

void getint(int & num)

num *= ***;

}int get_angle(int a, int b, int c)

void pre_line()

l[n].a = l[n - 1].b;

l[n].b = get_angle(n - 1, n, 1);

l[n].len = fabs(x[n] - x[n - 1] + y[n] - y[n - 1]);

}void pre_dis()

int main()

} int ans = 0;

bool *** = 0;

for(int i = 2; i < n; ++ i)

for(int j = i + 1; j <= n; ++ j)

} if(! ***) ans = max(ans, dis[1][i]);

} ans = max(ans, dis[1][n] - min(dis[0][n], dis[1][n]));

printf("%d\n", ans);

return 0;

}

303 序號互換

時間限制 1000 ms 記憶體限制 65535 kb 難度 2 描述 dr.kong設計了乙個聰明的機械人卡多,卡多會對 電子 中的單元格座標快速計算出來。單元格的行座標是由數字編號的數字序號,而列座標使用字母序號。觀察字母序號,發現第1列到第26列的字母序號分別為a,b,z,接著,第27列序號為...

矩陣快速冪 bzoi4000 棋盤

bzoj4000傳送門 我一上來打了個傻乎乎的狀壓。成功tle 50 不要阻止我裝sb。其實這道題敘述有點問題,給的那個3 p的矩陣,第一行是第0行。那麼就發現轉移只跟自己上一行的狀態有關,但n太大了,而狀態很少,少到能寫進乙個矩陣,快速冪get。只要構造出f i j i狀態能轉移到j狀態,則f i...

南陽 303序號互換

時間限制 1000 ms 記憶體限制 65535 kb 難度 2 描述 dr.kong設計了乙個聰明的機械人卡多,卡多會對 電子 中的單元格座標快速計算出來。單元格的行座標是由數字編號的數字序號,而列座標使用字母序號。觀察字母序號,發現第1列到第26列的字母序號分別為a,b,z,接著,第27列序號為...