題解 51nod2558 選址

2022-05-02 01:57:08 字數 1198 閱讀 6593

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...