洛谷P3237 HNOI2014 公尺特運輸

2022-01-10 19:13:05 字數 2659 閱讀 6285

公尺特是d星球上一種非常神秘的物質,蘊含著巨大的能量。在以公尺特為主要能源的d星上,這種公尺特能源的運輸和儲

存一直是乙個大問題。d星上有n個城市,我們將其順序編號為1到n,1號城市為首都。這n個城市由n-1條單向高速

通道連線起來,構成一棵以1號城市(首部)為根的樹,高速通道的方向由樹中的兒子指向父親。樹按深度分層:

根結點深度為0,屬於第1層;根結點的子節點深度為1,屬於第2層;依此類推,深度為i的結點屬於第i+l層。建好

高速通道之後,d星人開始考慮如何具體地儲存和傳輸公尺特資源。由於發展程度不同,每個城市儲存公尺特的能力不

盡相同,其中第i個城市建有乙個容量為a[i]的公尺特儲存器。這個公尺特儲存器除了具有儲存的功能,還具有自動收

集公尺特的能力。如果到了晚上六點,有某個儲存器處於未滿的狀態,它就會自動收集大氣中蘊含的公尺特能源,在早

上六點之前就能收集滿;但是,只有在儲存器完全空的狀態下啟動自動收集程式才是安全的,未滿而又非空時啟動

可能有安全隱患。早上六點到七點間,根節點城市(1號城市)會將其儲存器裡的公尺特消耗殆盡。根節點不會自動

蒐集公尺特,它只接受子節點傳輸來的公尺特。早上七點,城市之間啟動公尺特傳輸過程,傳輸過程逐層遞進:先是第2

層節點城市向第1層(根節點城市,即1號城市)傳輸,直到第1層的儲存器滿或第2層的儲存器全為空;然後是第3

層向第2層傳輸,直到對於第2層的每個節點,其儲存器滿或其予節點(位於第3層)的儲存器全為空;依此類推,

直到最後一層傳輸完成。傳輸過程一定會在晚上六點前完成。

由於技術原因,運輸方案需要滿足以下條件:

(1)不能讓某個儲存器到了晚上六點傳輸結束時還處於非空但又未滿的狀態,這個時候儲存器仍然會啟動自動收集

公尺特的程式,而給已經儲存有公尺特的儲存器啟動收集程式可能導致危險,也就是說要讓儲存器到了晚上六點時要麼

空要麼滿;

(2)關於首都——即1號城市的特殊情況, 每天早上六點到七點間1號城市中的公尺特儲存器裡的公尺特會自動被消耗

殆盡,即運輸方案不需要考慮首都的公尺特怎麼運走;

(3)除了1號城市,每個節點必須在其子節點城市向它運輸公尺特之前將這座城市的公尺特儲存器中原本存有的公尺特全部

運出去給父節點,不允許儲存器中殘存的公尺特與外來的公尺特發生混合;

(4)運向某乙個城市的若干個**的公尺特數量必須完全相同,不然,這些**不同的公尺特按不同比例混合之後可能

發生危險。

現在d星人已經建立好高速通道,每個城市也有了一定儲存容量的公尺特儲存器。為了滿足上面的限制條件,可能需

要重建一些城市中的公尺特儲存器。你可以,也只能,將某一座城市(包括首都)中原來存在的公尺特儲存器摧毀,再

新建一座任意容量的新的公尺特儲存器,其容量可以是小數(在輸入資料中,儲存器原始容量是正整數,但重建後可

以是小數),不能是負數或零,使得需要被重建的公尺特儲存器的數目盡量少。

第一行是乙個正整數n,表示城市的數目。

接下來n行,每行乙個正整數,其中的第i行表示第i個城市原來存在的公尺特儲存器的容量。

再接下來是n-i行,每行兩個正整數a,b表示城市b到城市a有一條高速通道(a≠b)。

n<500000,a[j]<108

輸出檔案僅包含一行,乙個整數,表示最少的被重建(即修改儲存器容量)的公尺特儲存器的數目。

sample input

1 21 3

2 42 5

sample output

乙個最優解是將a[1]改成8,a[3]改成4,a[5]改成2。 這樣,2和3運給1的量相等,4和5運給2的量相等,且每天晚上六點的時候,1,2滿,3,4,5空,滿足所有限制條件

一句話題意:給一棵樹,每個點有乙個權值,要求修改一些點的權值,使得:

①同乙個父親的兒子權值必須相同

②父親的取值必須是所有兒子權值之和

由上面的性質我們可以看出,只要乙個點的價值確定了,那麼整棵樹的權值也就確定了

所以我們可以列舉每乙個節點,求出該節點保留時根節點的價值

但是如果我們每遍歷到乙個節點,就做一次樹形dp,時間效率顯然是不能接受的

所以我們定義f[x]為以x節點作為保留的節點時根節點的價值

我們把當前節點價值一直向上乘就可以得到根節點的價值

最後再求出相同的個數最多有多少個就可以了

但是要注意的是,一直向上乘會超long long,所以我們log函式取對數

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

const int maxn=500005;

typedef long long ll;

typedef double dd;

dd a[maxn],f[maxn];

int n;

vectorb[maxn];

void dfs(int now,dd sum)

}int main()

for(int i=1;idfs(1,log(1.0));

sort(f+1,f+1+n);

int cnt=1,ans=-1;

for(int i=2;i<=n;i++) else

}printf("%d\n",n-ans);

return 0;

}

洛谷P2014 選課

題目描述 在大學裡每個學生,為了達到一定的學分,必須從很多課程裡選擇一些課程來學習,在課程裡有些課程必須在某些課程之前學習,如高等數學總是在其它課程之前學習。現在有n門功課,每門課有個學分,每門課有一門或沒有直接先修課 若課程a是課程b的先修課即只有學完了課程a,才能學習課程b 乙個學生要從這些課程...

洛谷P2014 選課

又是一道樹型dp,不過這次是以點帶權值,因為根是不確定的,我們可以設個虛根 0 因為算是多了一點,所以總點數應該 因為是點帶權值,所以不用dfs邊的數量了,不過有一點虛注意,因為多了乙個點,所以j層迴圈 所選的邊數 下界應該是到2的。include include using namespace s...

洛谷P2014 選課

題目描述 在大學裡每個學生,為了達到一定的學分,必須從很多課程裡選擇一些課程來學習,在課程裡有些課程必須在某些課程之前學習,如高等數學總是在其它課程之前學習。現在有n門功課,每門課有個學分,每門課有一門或沒有直接先修課 若課程a是課程b的先修課即只有學完了課程a,才能學習課程b 乙個學生要從這些課程...