51Nod 1475 建設國家 貪心 列舉

2021-09-10 18:29:08 字數 1747 閱讀 8148

題目

小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個城市的兩個屬性,即直徑和能容納人口數。

輸出

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

樣例輸入

5 10

1 11 1

2 23 3

4 4

樣例輸出

11
分析

那麼問題就變為將城市放置在相應的方框中,使得城市直徑+對應方框中的數<=h,且總人口最大。該如何放置城市呢?設某一城市的直徑為h,那麼h-h表示從城市出口到首都所允許的最大的距離,那麼只要方框中的數<=h-h,那麼這個城市就可以放置在這個方框中。貪心法,先對城市進行排序,以城市人口為第一關鍵字,降序排列,以城市直徑為第二關鍵字,公升序排列,然後依次放置城市,放置城市的策略是找到能放置此城市的最後的一層,即h-h層,如果h-h層已經放置了,就繼續往序號小的層查詢。看到這,發現這個貪心問題和 51nod_1163 最高的獎勵【貪心】差不多,但此處的不同是最後一層有兩個放置點,我們可以先列舉最後一層的位置,然後問題就和「最高的獎勵」一樣了。具體看程式

c++程式

#include#includeusing namespace std;

const int n=1005;

typedef long long ll;

struct node

}a[n];

int num[n];//記錄到首都的距離為i的方框的個數

int main()}}

ans=max(ans,temp);

} printf("%lld\n",ans);

return 0;

}

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