題意
先講一下一種容易陷入誤區錯誤思路
要使時間最小,就去找相對於每個點的最短曼哈頓距離,然後取最大值,時間就是(maxn+1)/2。
**
#include#include#include#include#include#define ll long long
#define mx 55
using namespace std;
int d[mx][mx];
int x[mx],y[mx];
int ans=0;
int man=1<<30;
int n;
int main()
for(int i=1;i<=n;++i)
} for(int i=1;i<=n;++i)
ans=max(ans,man);
} printf("%d",(ans+1)/2);
return 0;
}
這樣做只有20分,為什麼錯了?
因為每次取最小的會使你遺漏邊,有些邊是一定要選的卻沒選,不選的話會導致聯通塊不連通,舉個例子吧
咕咕,因為圖床問題暫時咕咕
如果按照上面的方法就只會選到紅邊,但黑邊至少要選一條,這就會導致聯通塊不連通,所以錯誤了。
正解一種比較巧妙的方法,可以看作在最長距離中找乙個最短的曼哈頓距離便可以二分,判斷聯通可以用並查集或者bfs。
**
#includeusing namespace std;
int n,ans,l,r,cnt,fa[60],zx[60],zy[60];
int find(int x)
int main()
l=0,r=1e9;
while(l<=r)
for(int i=1;i<=n;++i)
}} cnt=0;
for(int i=1;i<=n;++i)
if(cnt==1) r=mid-1;
else l=mid+1;
} printf("%d",l);
return 0;
}
另外這道題還可以計算出任意兩點間聯通的時間,然後求最小生成樹(mst),則mst的最大邊就是答案。因為mst的性質之一就是滿足任意兩點間的最大邊權最小。 洛谷P1650 田忌賽馬 楊子曰題目
題目描述田忌很沮喪,直到他遇到了著名的軍師 孫臏。田忌採用了孫臏的計策之後,三場比賽下來,輕鬆而優雅地贏了齊王200銀幣。這實在是個很簡單的計策。由於齊王總是先出最好的馬,再出次好的,所以田忌用常規馬對齊王的超級馬,用自己的超級馬對齊王的上級馬,用自己的上級馬對齊王的常規馬,以兩勝一負的戰績贏得20...
洛谷P1661擴散 二分 並查集
首先我們先二分答案,然後用並查集記錄有多少個聯通塊。如果兩個聯通塊成為乙個聯通塊,則他們的哈密頓距離小於擴散時間的一半。因此可以二分答案,檢查是否等於乙個聯通塊就行了。include include include include using namespace std typedef long l...
洛谷P1661 資訊奧賽一本通1437 擴散
洛谷 資訊奧賽一本通 時間限制 1000 ms 記憶體限制 65536 kb 提交數 676 通過數 347 乙個點每過乙個單位時間就會向四個方向擴散乙個距離,如圖。兩個點a a b b 連通,記作e a b e a,b 當且僅當a a b b的擴散區域有公共部分。連通塊的定義是塊內的任意兩個點u ...