poj 3662 最小化第k大的值

2021-09-08 17:40:20 字數 1343 閱讀 5383

題目大意

有n個節點以及連線的p個無向邊,現在要通過這p條邊從1號節點連線到n號節點。若無法連線成功,則返回-1;若能夠連線成功,那麼其中用到了l條邊,這l條邊中有k條邊可以免費,l-k條邊不能免費,求出不能免費的邊的最大長度。

題目分析

實現(c++)

#include#include#include#include#includeusing namespace std;

#define max_node 1005

#define max_edge 20005

#define inf 1 << 28

#define min(a, b) a < b?a:b

#define max(a, b) a >b? a:b

struct edge;

struct nodedist;

};struct cmp

};edge gedges[max_edge];

int gedgecount;

int ghead[max_node];

int gdist[max_node];

bool **isited[max_node];

void insertedge(int u, int v, int d)

int dijkstra(int s, int t, int k)

for (int e = ghead[nd.v]; e != -1; e = gedges[e].next)

} }return gdist[t];

}int minstep(int s, int t)

for (int e = ghead[p.first]; e != -1; e = gedges[e].next)

} }return -1;

}int gedgedist[max_edge];

int main()

int min_step = minstep(1, n);

if (min_step == -1)

else if (min_step <= k)

sort(gedgedist, gedgedist + e_count);

int beg = 0, end = e_count, mid;

int rr;

while (beg < end)

else

} //最後得到的是,滿足路徑中邊長大於等於 x 的長度的邊數 大於k 最大的 x

printf("%d\n", rr);

} return 0;

}

查詢第K大的值

這種題一般是給定n個數,然後n個數之間通過某種計算得到了新的數列,求這新的數列的第k大的值 poj3579 題意 用 n 個數的序列 x i 生成乙個新序列 b 新的序列定義為 對於任意的 i j 且 i j 有 b abs x i x j 問新序列的中位數是什麼,如果新序列的長度為偶數那麼我們定義...

POJ 3273(二分,最小化最大值)

和這道題一樣了 description 聰哥在暑假參加了打零工的活動,這個活動分為n個工作日,每個工作日的工資為vi。有m個結算工錢的時間,聰哥可以自由安排這些時間,也就是說什麼時候拿錢,老闆說的不算,聰哥才有發言權!因為聰哥是土豪,他是老闆的老闆 聰哥不喜歡身上一次性有太多的錢,於是他想安排一下拿...

poj 3272 二分答案 最大值最小化

原題 給n個數 讓分成m個區域 讓最大值最小 可以通過二分答案來做 二分的範圍就是這n個數的最大值到他們的總和了 那麼我們防止邊界的問題 所以鬆弛一下 左右邊界各擴乙個點 然後每個mid就是要求的值 去跑個judge函式 看可劃分的區域個數 可劃分的區域個數如果 m 那麼就把上界下壓 如果 m 說明...