2015程式設計之美初賽第一場 B 建造金字塔

2021-07-02 02:39:15 字數 2260 閱讀 8666

時間限制:4000ms 單點時限:2000ms 記憶體限制:256mb

描述 在二次元中,金字塔是乙個底邊在x軸上的等腰直角三角形。

你是二次元世界的乙個建築承包商。現在有n個建造訂單,每個訂單有乙個收益w,即建造此金字塔可獲得w的收益。對每個訂單可以選擇建造或不建造。

建造乙個金字塔的成本是金字塔的面積,如果兩個或多個金字塔有重疊面積,則建造這些金字塔時重疊部份僅需建造一次。

建造一組金字塔的總利潤是收益總和扣除成本。現給出這些訂單,請求出最大利潤。

輸入 輸入資料第一行為乙個整數t,表示資料組數。

每組資料第一行為乙個整數n,表示訂單數目。

接下來n行,每行三個整數x, y, w,表示乙個訂單。(x, y)表示建造出的金字塔的頂點,w表示收益。

輸出 對於每組資料輸出一行」case #x: y」,x表示資料編號(從1開始),y表示最大利潤,四捨五入到小數點後兩位。

資料範圍

1 ≤ t ≤ 20

0 ≤ w ≤ 107

小資料1 ≤ n ≤ 20

0 ≤ x, y ≤ 20

大資料1 ≤ n ≤ 1000

0 ≤ x, y ≤ 1000

樣例輸入

3 2

2 2 3

6 2 5

3 1 1 1

2 2 3

3 3 5

3 1 1 1

2 2 3

3 3 6

樣例輸出

case #1: 1.00

case #2: 0.00

case #3: 1.00

2.解題思路:很顯然的動態規劃問題,類似於揹包問題,故本題利用區間dp解決。本題要求這些訂單中的最大收益。首先可以知道,為了包含整個三角形,我們關注點放在三角形最右邊點。因此,對於所有的三角形,用狀態(l,r,w)來描述它。

接下來,定義d(j)表示區間[0,j]上收益的最大值。事先我們要統計出最大邊界lim,這樣j的變化範圍就是0≤j≤lim。下面考慮如何尋找狀態轉移方程。

(1)當j≥x[i].r且時,表示第i個三角形完全包括在[0,j]之間,取建造它與不建造它收益的較大者。即d(j)=max;

(2)當不滿足(1)時但j≥x[i].l時,我們關注的是x[i].r處的收益最大值,畫圖後容易知道,收益增加值是建造第i個金字塔的收益w減去多建設的面積,即s(x[i].l,x[i].r)-s(x[i].l,j)。即得到如下狀態轉移方程:d(x[i].r)=max;

(3)當前兩個均不滿足時,狀態轉移方程其實和(2)類似,即d(x[i].r)=max;

最後,不要忘記一種特殊情況:只建造第i個金字塔時候的收益,因此最後還要取上述計算出的收益和只建造第i個金字塔收益的較大者。

當所有區間的收益最大值計算完畢後,答案就是他們中的最大值。注意事先要把d(j)都初始化為無窮小,表示沒有計算過。

#define _crt_secure_no_warnings 

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

double dp[2100];//dp[j]表示[0,j]範圍內的最大收益

struct atomx[1100];

int n;

int compare(atom k1, atom k2)

double solve()

; lim = max(lim, k1 + k2);

}sort(x + 1, x + n + 1, compare);//按照左邊界由小大到

for (int i = 0; i <= lim; i++) dp[i] = -1e18;//初始化為無窮小

for (int i = 1; i <= n; i++)

double ans = 0;

for (int i = 0; i <= lim; i++) ans = max(ans, dp[i]);//取所有範圍中的最大者

return ans;

}int main()

return

0;}

程式設計之美初賽第一場

時間限制 12000ms 單點時限 6000ms 記憶體限制 256mb a市是乙個高度規劃的城市。可是科技高階發達的地方,居民們也不能忘記運動和鍛鍊,因此城市規劃局在設計a市的時候也要考慮為居民們建造乙個活動中心。方便居住在a市的居民們能隨時開展運動。鍛鍊強健的身心。城市規劃局希望活動中心的位置滿...

2014程式設計之美初賽第一場

時間限制 2000ms 單點時限 1000ms 記憶體限制 256mb 一般來說,我們採用針孔相機模型,也就是認為它用到的是小孔成像原理。在相機座標系下,一般來說,我們用到的單位長度,不是 公尺 這樣的國際單位,而是相鄰畫素的長度。而焦距在相機座標系中的大小,是在影象處理領域的乙個非常重要的物理量。...

程式設計之美初賽(第一場) 焦距

時間限制 2000ms 單點時限 1000ms 記憶體限制 256mb 一般來說,我們採用針孔相機模型,也就是認為它用到的是小孔成像原理。在相機座標系下,一般來說,我們用到的單位長度,不是 公尺 這樣的國際單位,而是相鄰畫素的長度。而焦距在相機座標系中的大小,是在影象處理領域的乙個非常重要的物理量。...