51nod 1475 建設國家 優先佇列

2021-08-10 16:15:07 字數 1672 閱讀 3428

小c現在想建設乙個國家。這個國家中有乙個首都,然後有若干個中間站,還有若干個城市。

現在小c想把國家建造成這樣的形狀:選若干(可以是0個)的中間站把他們連成一條直線,然後把首都(首都也是乙個中間站)連在這一條直線的左端。然後每個點可以連乙個城市,特別的是最右端的點可以連線兩個城市。

現在有n個城市的規劃供小c選擇。但是,他們那兒的交通條件比較差,他們那兒一天是2*h個小時,每個城市裡面的人每天都會去首都拿一樣東西,從他們所在的城市出發,到了首都之後拿了東西就走(拿東西的時間可以忽略不計),他們要在2*h個小時之內返回他們自己的家中(從家中出發到返回家中不超過2*h小時)。

每個城市有兩個屬性,乙個是城市的直徑,另外乙個是能居住的人口數目。對於第i個城市而言,這兩個屬性分別是hi,pi。

城市的直徑的意思是離這個城市出口最遠的人想要出城先要在城裡行走的最少的時間。

在首都,中間站,城市之間行走要花費1小時的時間。

小c想選擇一些城市然後通過若干的中間站和首都連線起來,在每個人能在2*h小時返回的條件下所有城市居住的總人口數目要最多。

樣例解釋:最上面的藍點表示首都,其它的藍點表示中間站,剩下的紅圈表示選擇的城市。

單組測試資料。

第一行包含兩個整數n 和h (1 ≤ n ≤ 1000,1 ≤ h ≤ 1000000000),表示可供選擇的城市數目和時間限制。

接下來n行,每行有兩個整數hi, pi (1 ≤ hi ≤ h, 1 ≤ pi ≤ 1000),第i個城市的兩個屬性,即直徑和能容納人口數。

output

輸出最多能居住的人口數目。
input示例

5 10

1 11 1

2 23 3

4 4

output示例

11
system message

(題目提供者)

還是一道優先佇列的題目。

對於n個城市,我們先求出每個城市最大,之後倒著來放。先放承受能力大的。

之後對於第i層,如果佇列數量大於等於i了,先取出小的,變成i-1。

之後開始把這一層能承受的城市全都放入佇列。

放完後可能對多了,我們要在取出一些小的,讓佇列數量變成i+1,之所以是i+1不是i,是因為最後乙個位置能放兩個。

其實就是貪心處理每一層,讓每一層都是最優解,之後求出最大的即可。

#include

#include

#include

#include

#include

#include

const int n=1005;

using namespace std;

priority_queue,greater>pq;

vectorv[n];

int main()

int ans=0;

int sum=0;

for(int i=1;i<=n;i++)  //列舉每乙個位置

for(int j=0;ji+1;pq.pop())  //全都放進入之後再把最小的全都踢出去

ans=max(ans,sum);

}

cout<

}

51Nod 1475 建設國家 貪心 列舉

題目 小c現在想建設乙個國家。這個國家中有乙個首都,然後有若干個中間站,還有若干個城市。現在小c想把國家建造成這樣的形狀 選若干 可以是0個 的中間站把他們連成一條直線,然後把首都 首都也是乙個中間站 連在這一條直線的左端。然後每個點可以連乙個城市,特別的是最右端的點可以連線兩個城市。現在有n個城市...

51nod1475 貪心 列舉

題意 中文題誒 思路 看懂題意後,首先想到的是貪心 按照人數非遞增排序,對於當前城市盡量將其排在離首都遠的地方,這樣得到的人數顯然是最大的 對於最右邊可以放兩個城市,我一開始是將其餘城市都安排好,再從剩下的城市中選擇乙個人數盡量多的。然而wa了 舉乙個反例 5 54 1 3 22 3 1 41 4 ...

1475 建設國家

這題一開始我是用貪心去做的,但是一直沒過。貌似貪心並不能得到最優解法。然後這道題用優先佇列來寫 首先我們先把對於第i的中間站可以連線的城市用向量陣列存起來。然後在只有滿足中間站數量這題真的是很妙。膜拜ing include include include include include includ...