51nod
本人用的是官方題解的做法(就解題報告裡那個).
首先用 \(\texttt\) 求出兩個點之間的最短路.
考慮列舉答案所在的邊,設當前列舉的是 \((x,y)\).
我們把所有點(包括 \(x,y\))按照離 \(x\) 的距離從大到小排序,
設排完序後的陣列為 \(c\),列舉 \(i\),令最終選的點到 \(c_i\dots c_n\) 這些點都經過 \(x\),
顯然最長的一條路是 \(x\to c_i\).
然後讓 \(c_1\dots c_\) 這些點都經過 \(y\),維護路徑長度的最大值.
這樣我們就找出了一條最長路,而最長路的中點即為答案點所在.
但是要注意乙個地方:這個中點可能不在列舉的這條邊上.
因此排除掉這種情況即可.
#include #include #include #include #define ll long long
#define filein(a) freopen(a,"r",stdin)
#define fileout(a) freopen(a,"w",stdout);
using namespace std;
inline int read()
while(c>='0'&&c<='9'&&c!=eof)
return sum*f;
}const int n=205;
const int inf=0x3f3f3f3f;
struct edgea[n*n];
int n,m,c[n];ll d[n][n],f[n];
inline bool cmp(int a,int b)
int main();
d[y][x]=d[x][y]=min(d[x][y],1ll*w);
} for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
d[i][j]=min(d[i][j],d[i][k]+d[k][j]);
ll ans=inf;
for(int i=1;i<=m;i++)
} printf("%lf\n",1.0*ans/2);
return 0;
}
題解 51nod 1327 棋盤遊戲
51nod 1327 棋盤遊戲 求合法方案數 這題挺妙的,雖然可能妙得不是非常直觀 首先,因為考慮每一列只能填乙個,考慮怎麼填 宣告 l i 為以 i 為左區間右端點的行數,r i 為以 i 為右區間左端點的行數,mid i 為第 i 列上有多少沒有被左右區間覆蓋的行數 於是可以設計乙個狀態 f i...
51Nod1381 硬幣遊戲(概率 題解)
有乙個簡單但是很有趣的遊戲。在這個遊戲中有乙個硬幣還有一張桌子,這張桌子上有很多平行線 如下圖所示 兩條相鄰平行線之間的距離是1,硬幣的半徑是r,然後我們來拋硬幣到桌子上,拋下之後硬幣有時候會和一些直線相交 相切的情況也算是相交 有時候不會。請你來計算一下拋一次硬幣之後,該硬幣和直線相交數目的期望。...
51nod 1428 活動安排問題 題解
題目傳送門 好久沒寫了,刷題的時候看到了這個經典題,就來寫一下,我見過的原題叫校門外的樹。題意一樣,我們只要把一開始的時間的開始和結束節點排個序,然後一遍掃過去,如果是開頭就sum 如果是節點就sum 然後中途sum的最大值就是答案了。聽一些dalao說這叫做差分。include include i...