P2498 [SDOI2012]拯救小云公主
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                P2498 [SDOI2012]拯救小云公主
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
                                P2498 [SDOI2012]拯救小云公主
題意:
一個row * line的矩形,英雄在左下角(1,1),公主在右上角(row,line),有n個位置是boss。英雄現在要去公主那里,但是要避開boos,英雄決定找一條路徑使到距離boss的最短距離最遠。雄走的方向是任意的。
 問英雄的路徑離boss的最遠距離
題解:
不難看出是二分,我們二分距離boss的距離mid,那怎么判斷呢?
 有個很巧妙的方法
 英雄不能去的位置就是以boss為中心,mid為半徑的圓,因為有n個boss,也就是有n個園,如果這n個圓可以阻斷從左下角到右上角的路,說明這個距離就是不合法的。那我們就從與左側和上惻相交的圓開始,不斷往外擴,與圓相交的就加入隊列中,看是否可以擴到右側和下惻墻壁
 詳細可見代碼
代碼:
// Problem: P2498 [SDOI2012]拯救小云公主 // Contest: Luogu // URL: https://www.luogu.com.cn/problem/P2498 // Memory Limit: 125 MB // Time Limit: 1000 ms // Data:2021-09-08 20:04:58 // By Jozky#include <bits/stdc++.h> #include <unordered_map> #define debug(a, b) printf("%s = %d\n", a, b); using namespace std; typedef long long ll; typedef unsigned long long ull; typedef pair<int, int> PII; clock_t startTime, endTime; //Fe~Jozky const ll INF_ll= 1e18; const int INF_int= 0x3f3f3f3f; void read(){}; template <typename _Tp, typename... _Tps> void read(_Tp& x, _Tps&... Ar) {x= 0;char c= getchar();bool flag= 0;while (c < '0' || c > '9')flag|= (c == '-'), c= getchar();while (c >= '0' && c <= '9')x= (x << 3) + (x << 1) + (c ^ 48), c= getchar();if (flag)x= -x;read(Ar...); } template <typename T> inline void write(T x) {if (x < 0) {x= ~(x - 1);putchar('-');}if (x > 9)write(x / 10);putchar(x % 10 + '0'); } void rd_test() { #ifdef ONLINE_JUDGE #elsestartTime= clock();freopen("in.txt", "r", stdin); #endif } void Time_test() { #ifdef ONLINE_JUDGE #elseendTime= clock();printf("\nRun Time:%lfs\n", (double)(endTime - startTime) / CLOCKS_PER_SEC); #endif } const int maxn= 4e5; struct node {int x, y; } a[maxn]; int dis[4000][4000]; int vis[maxn]; int n, row, line; queue<int> q; bool able(int d, double r) { //可以相交return r * r * 4 > d; } bool check(double r) {for(int i=1;i<=n;i++)vis[i]=0;while (!q.empty())q.pop();for (int i= 1; i <= n; i++) {if (a[i].x < r || row - a[i].y < r) { //將左側和上側相連的boss加入隊列q.push(i);vis[i]= 1;}}while (!q.empty()) {int top= q.front();q.pop();if (line - a[top].x < r || a[top].y < r) //如果與右側和下側相交,則說明不合法return 0;for (int i= 1; i <= n; i++) {if (!vis[i] && able(dis[top][i], r)) { //如果相交,加入隊列vis[i]= 1;q.push(i);}}}return 1; } int Dis(int x, int y) {return (a[x].x - a[y].x) * (a[x].x - a[y].x) + (a[x].y - a[y].y) * (a[x].y - a[y].y); } const double eps= 1e-7; int main() {rd_test();read(n, line, row);row--;line--;for (int i= 1; i <= n; i++) {cin >> a[i].x >> a[i].y;a[i].x--;a[i].y--;}for (int i= 1; i <= n; i++) {for (int j= i + 1; j <= n; j++) {dis[i][j]= dis[j][i]= Dis(i, j);}}double l= 0.0, r= r=min(row,line);while (fabs(l - r) > eps) {double mid= (l + r) / 2; // printf("mid=%lf\n",mid); // cout<<"mid="<<mid<<endl;if (!check(mid))r= mid;elsel= mid ;}printf("%.2lf\n",l);return 0; // cout << l << endl;//Time_test(); }總結
以上是生活随笔為你收集整理的P2498 [SDOI2012]拯救小云公主的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: 阿里云服务器怎么绑定域名(阿里云服务器怎
 - 下一篇: 万网买的域名怎么备案(万网买的域名怎么备