中石油訓練賽 小說 最短路 二分

2021-09-27 07:24:43 字數 1506 閱讀 9267

題目大意:給出乙個無環無向圖,以及k,定義答案是點1到點n的任意一條路徑上,所經過的所有邊的權值中的第k大值,求答案的最小值。(題目是中文題面,沒看懂大意可以直接去看原題目。。)

題目分析:因為是要求權值中的最值,不是求最短路是多少,所以一開始想到的是最小生成樹,然後從大到小減去k個值,就是答案了,可惜的是,最小生成樹的話,不一定會包括最優解,隨便舉個反例,如果我們的k是1,就是需要刪掉乙個邊後的最大值,那麼有兩條路徑,一條是1,2,9,還有一條是3,3,3,很顯然最小生成樹會選擇第二組邊來生成樹,而不是第一組邊,但是選擇第一組邊的路徑答案是2,第二組的答案是3,故思路明顯錯誤。

然後就要考慮最短路了,畢竟給了乙個圖,而且還有權值,題目給了1秒的時間,那麼暴力肯定是不行的(雖然暴力我也沒有思路。。),我們可以注意到,每個邊的權值非常小,只有1e6,平常的最短路權值都不會考慮到時間複雜度中去,所以直接給1e9方便,所以我們自然而然可以想到對權值下手,1e6的話如果只是o(n)的話也離超時不遠了,所以考慮一下logn的演算法,好吧,是我隊友想出來的,可以二分一下權值,因為答案也是要求輸出乙個值,正好就是需要輸出權值,那麼我們二分權值後,在迪傑斯特拉中稍微一做修改,就能求出從1到n這條路上需要刪除掉幾條邊才能讓答案滿足我們二分的答案,然後根據這個寫乙個check函式,配合上迪傑斯特拉,總時間複雜度就是n*logn*logw了,沒仔細算,不過肯定很小,因為n只有1000,

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

typedef long long ll;

const int inf=0x3f3f3f3f;

const int n=1e3+100;

int limit;

int n,m,k;

struct node//node結構體兩個用途,乙個是優先佇列用,乙個是鄰接錶用

bool operator<(const node& a)const//注意優先佇列的運算子過載是相反的 };

vectornode[n];

int d[n];

bool vis[n];

void dijkstra()

priority_queueq;

d[1]=0;

q.push(node(1,0));

while(!q.empty())

} }}

bool check(int x)

int main()

limit=1e6+100;

dijkstra();

if(d[n]==inf)

return 0*printf("-1\n");

int l=0;

int r=1e6;

int ans;

while(l<=r)

else

}cout

}

中石油訓練賽 招待 思維

題目大意 給出乙個天平,砝碼由3的冪次組成,再給出物品重量,求如何擺放砝碼能使得天平平衡 題目分析 既然給出的砝碼是3的冪次組成,那麼我們就將給出的物品重量轉換為三進製即可,那麼表示其每一位只有可能是0,1,2三個數字,我們假設物品擺在a盤,那麼 當前位數字為0,就說明該冪次沒有貢獻,所以不做處理 ...

中石油訓練賽 姓氏 思維 水題

在乙個很大的課室裡,裡面有很多學生在聽課。l老師挑選了其中的n個不同的學生起立回答問題,l老師對起立的每乙個學生都是問同樣的問題 在本課室裡,和你同姓的學生有多少人 不包括你自己 這n個起立的同學的回答如下 第1位起立的同學回答 和我同姓的,除了我之外,本課室裡還有a 1 個學生。第2位起立的同學回...

訓練賽之 最短路

題意 給定n個點m條邊的無向圖 邊權全為1 讓你去掉最多的邊使得d s1,t1 l1 d s2,t2 l2,若不能滿足輸出 1,反之輸出可以去掉的最多邊數。思路 spfa預處理所有點之間的距離。求出在滿足d s1,t1 l1 d s2,t2 l2的前提下,路徑需要的最少邊數ans,答案就是m ans...