51Nod 建設國家(DP)

2021-07-24 13:18:45 字數 1820 閱讀 1944



1475 建設國家

基準時間限制:1

秒 空間限制:131072

kb 分值:

20難度:3級演算法題

小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

(題目提供者)

剛看到這題目的時候一臉懵逼,因為完全不懂題意,來回想了半天感覺排個序就行,wa哭后發現沒呢麼簡單,看了一發題解,用的什麼優先佇列,畢竟不是熟悉的姿勢,後來又看到有人用dp寫,想到dp,立馬懂了該怎麼寫,最後卡是因為呢個坑點(最右端可以連線連個城市!!)

大致思路:首先你要對這n個城市的距離進行排序,最貪心的策略就是把城市直徑最大的放在最前邊,這個很好想,然後按照人口多少排;

然後就是dp了,怎麼dp呢,我是這樣想的:

dp[i][j]:表示從前i個城市裡選擇j個城市使得人口數最大

則狀態轉移方程:dp[i][j]=max(dp[i-1][j-1]+a[i].num,dp[i][j])

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

typedef long long ll;

#define maxn 1005

ll dp[maxn][maxn];

struct node

a[maxn];

bool comp(node a,node b)

int main()

} if(n==1)ans=max(ans,dp[1][1]);

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

}

51nod 1475 建設國家 優先佇列

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

51Nod 1475 建設國家 貪心 列舉

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

51nod 排列與交換 序列dp

算是比較簡單的七級題了吧,也是經典的序列交換型別的dp。明顯有f i j 表示前i個交換j次的方案數。對於第一問,每次轉移的時候直接把之前的方案繼承過來。最後統計答案的時候,只要交換次數與k的奇偶性相同,就可累加到答案內,因為剩餘的步數我可以兩點之間xjb交換。但是會算重,因為我這樣的計算是盡量把每...