時間限制: 1 sec 記憶體限制: 256 mb給出數字n(1<=n<=10000),x(1<=x<=1000),y(1<=y<=1000),代表有n個敵人分布乙個x行y列的矩陣上,矩形的行號從0到x-1,列號從0到y-1再給出四個數字x1,y1,x2,y2,代表你要從點(x1,y1)移到(x2,y2)。在移動的過程中你當然希望離敵人的距離的最小值最大化,現在請求出這個值最大可以為多少,以及在這個前提下,你最少要走多少步才可以回到目標點。注意這裡距離的定義為兩點的曼哈頓距離,即某兩個點的座標分為(a,b),(c,d),那麼它們的距離為|a-c|+|b-d|。
第一行給出數字n,x,y
第二行給出x1,y1,x2,y2
下面將有n行,給出n個敵人所在的座標。
在一行內輸出你離敵人的距離及在這個距離的限制下,你回到目標點最少要移動多少步。
2 5 62 140 0 4 0
2 12 3
這道題貌似去東北集訓的大佬團做過的說,當時心裡就有種被坑的感覺,於是默默的想出了正解……
首先這道題第一問一看基本就可以知道可以二分,然後時間複雜度就多了乙個log x+y,spfa一遍大約是o(n),然後時間複雜度就是o(log (x+y)*n)。但是它有乙個對於與敵人距離的限制,所以我們還要提前bfs一遍所有點看一下他們到敵人的距離是多少。
順便說乙個坑點,對於每乙個二分的距離我們都應首先判斷一下起點是否符合否則直接falseq某犇被這點坑慘了。
1 #include2 #include3 #include4 #include5 #include6 #include7 #include8view codeusing
namespace
std;
9int
n,l,r,sx,sy,tx,ty;
10int dr[10005][2
];11
int mn[1005][1005
];12
struct
node;
16bool rd[1005][1005
];17
bool hf(int x,int
y)23
return0;
24}25int dis[1005][1005
];26
void
spf1()
38while(!q1.empty())
3954}55
if(hf(x+1,y)&&mn[x+1][y]>mn[x][y]+1)56
65}66if(hf(x,y-1)&&mn[x][y-1]>mn[x][y]+1)67
76}77if(hf(x,y+1)&&mn[x][y+1]>mn[x][y]+1)78
87}88}
89}90int ans[2
];91
bool check(int
l)119
}120
if(hf(x+1,y)&&dis[x+1][y]>dis[x][y]+1&&mn[x+1][y]>=l)
121130
}131
if(hf(x,y-1)&&dis[x][y-1]>dis[x][y]+1&&mn[x][y-1]>=l)
132141
}142
if(hf(x,y+1)&&dis[x][y+1]>dis[x][y]+1&&mn[x][y+1]>=l)
143152
}153
}154
if(tmp==dis[tx][ty])
155return0;
156 ans[0]=l;
157 ans[1]=dis[tx][ty];
158return1;
159}
160int
main()
176 printf("
%d %d
",ans[0],ans[1
]);177
//while(1);
178return0;
179 }
勝利大逃亡
g 勝利大逃亡 time limit 2000msmemory limit 32768kb64bit io format i64d i64u submit status description ignatius被魔王抓走了,有一天魔王出差去了,這可是ignatius逃亡的好機會.魔王住在乙個城堡裡,...
勝利大逃亡
ignatius被魔王抓走了,有一天魔王出差去了,這可是ignatius逃亡的好機會.魔王住在乙個城堡裡,城堡是乙個a b c的立方體,可以被表示成a個b c的矩陣,剛開始ignatius被關在 0,0,0 的位置,離開城堡的門在 a 1,b 1,c 1 的位置,現在知道魔王將在t分鐘後回到城堡,i...
勝利大逃亡
ignatius被魔王抓走了,有一天魔王出差去了,這可是ignatius逃亡的好機會.魔王住在乙個城堡裡,城堡是乙個a b c的立方體,可以被表示成a個b c的矩陣,剛開始ignatius被關在 0,0,0 的位置,離開城堡的門在 a 1,b 1,c 1 的位置,現在知道魔王將在t分鐘後回到城堡,i...