題意:
有乙個m*m的格仔,左下角(0,0)右上角(m-1,m-1),網格裡面有兩個y座標相同的賓館(a,b),每個賓館裡面有乙個餐廳,一共用n個餐廳,第1,2個都在賓館裡,3,4...在其他位置,你現在要在空餘座標上建立乙個自己的餐廳,餐廳必須建立在最有利的位置上,什麼樣的位置算是有利的位置?如果你要在c這二個點建立乙個餐廳,假如你要比d這個餐廳的位置有利那麼你到a賓館裡裡面的餐廳1的距離比c到這個賓館的近,或者是到b的也行,只要有乙個比c的近,那麼你的位置就比c好,如果當前點想建立餐廳,那麼必須必所有的餐廳的位置都好才行,問一共多有多少個好的位置。
思路:吭了好幾個小時了,終於想出來了,對於每乙個已經有的餐館(包括第乙個和第二個),他們會限制兩個區域,分別是這兩個區域(用右上方這個點舉例):
每個點都有這樣類此的以ab連線對稱的兩個限制區域,我們把所有區域疊加起來,最後剩下的就是可行的區域,疊加的時候也很簡單,我們列舉x1--x2的所有x,yu[x]表示x節點在ab連線上方的最小限制值,yd[x]是下方的最大限制值,y[x] = minn(yu[x] - y ,yd[x] - y),表示的是在x這個點的這一豎列的最大非限制距離,然後就是簡單更新,具體細節看下面**。
#include
#define n 66000
#define inf 100000000
int maxx(int x ,int y)
int minn(int x ,int y)
int yu[n] ,yd[n] ,y[n];
int main ()
y[x1] = y[x2] = 0;
for(i = x1 + 1 ;i < x2 ;i ++)
y[i] = minn(yu[i] - y1 ,y1 - yd[i]);
for(i = x1 + 1 ;i < x2 ;i ++)
y[i] = minn(y[i-1] + 1 ,y[i]);
for(i = x2 - 1 ;i > x1 ;i --)
y[i] = minn(y[i+1] + 1 ,y[i]);
long long ans = 0;
for(i = x1 + 1 ;i < x2 ;i ++)
}printf("%lld\n" ,ans);
}return 0;
}
FZU 2086 餐廳點餐
本週周測就做了三道水題 因為時間問題,考試的時候沒有看 jack要點餐,他點餐有很多種套路,然後問你到底有多少種方法點餐。1 2 2 2 2 2 2 33 1 5 21 4 3 65 8 他會點1 2道葷菜,1 2道素菜。所以先分配葷素搭配有四種情況。可以優化比較min,max然後去掉 然後心情好的...
FZU 2086 餐廳點餐(列舉)
題意 有a種湯,b種飯,c種麵條,d種葷菜,e種素菜。jack每頓飯都會點1 2樣葷菜d,1 2樣素菜e 不重複 同時,在jack心情好的時候,會點一樣飯b,再配上一種湯a。在心情不好的時候,就只吃一種麵條c。總價在min max之間。jack想知道,總共有多少種不同的點餐方案。思路 暴力列舉 in...
LeetCode小解析 1333 餐廳過濾器
給你乙個餐館資訊陣列restaurants,其中restaurants i idi,ratingi,veganfriendlyi,pricei,distancei 你必須使用以下三個過濾器來過濾這些餐館資訊。其中素食者友好過濾器veganfriendly的值可以為true或者false,如果為 tr...