搭建雙塔
time limit:3000ms memory limit:65536k
total submit:197 accepted:103
description
2023年9月11日,一場突發的災難將紐約世界**中心大廈夷為平地,mr. f曾親眼目睹了這次災難。為了紀念「911」事件,mr. f決定自己用水晶來搭建一座雙塔。
mr. f有n塊水晶,每塊水晶有乙個高度,他想用這n塊水晶搭建兩座有同樣高度的塔,使他們成為一座雙塔,mr. f可以從這n塊水晶中任取m(1≤m≤n)塊來搭建。但是他不知道能否使兩座塔有同樣的高度,也不知道如果能搭建成一座雙塔,這座雙塔的最大高度是多少。所以他來請你幫忙。
給定水晶的數量n(1≤n≤100)和每塊水晶的高度hi(n塊水晶高度的總和不超過2000),你的任務是判斷mr. f能否用這些水晶搭建成一座雙塔(兩座塔有同樣的高度),如果能,則輸出所能搭建的雙塔的最大高度,否則輸出「impossible」。
input
輸入的第一行為乙個數n,表示水晶的數量。第二行為n個數,第i個數表示第i個水晶的高度。
output
輸出僅包含一行,如果能搭成一座雙塔,則輸出雙塔的最大高度,否則輸出乙個字串「impossible」。
sample input
5sample output1 3 4 5 2
7sourcevijos p1037
凍龜題。
階段:按處理每塊水晶劃分為n個階段
狀態:f[i][j] 前i塊水晶搭成雙塔,高低差為j時較低的塔最高的高度
決策:
1.不放
f[i-1][j]
2.放置在較高的塔上
f[i-1][j - v[i]] (j >= v[i])
3.放置在較低的塔上
(1)放置後超過了原較高的塔
f[i-1][v[i]-j]+v[i]-j (j < v[i])
(2)放置後仍低於原較高的塔
f[i-1][j + v[i]] + v[i] (j <= sum - v[i])
範圍:
1 <= i <= n
0 <= j <= sum (sum = v[1]+v[2]+...+v[n])
順序:
i:4個方程都只用到i-1,所以i從1到n依次列舉即可
j:有點亂,沒想出無判斷寫法;可以賦個初始特殊值(下面用-1表示),每次用到的時候判斷一下是否是特殊值
初值:
f[0][0] = 0
f[i][j] = -1 (特殊值,0 <= i <= n,0 <= j <= sum)
咳咳。所以最後漸進時間複雜度o(sumn)。不知道這麼寫對不對啊,題中說sum最大值為2000,故最壞的情況是o(2000n)。
吐槽:
原題時間限制3000ms,超暴力的做法也能a
**
:
1 #include 2ghcred's codeintn;
3int v[105], sum, f[105][2005];4
5void getint_(int &num)613
14void getmax(int &t1, int
t2)15
2021
void
input()
2229
return;30
}3132void
solve()
3350
return;51
}5253void
output()
5461
62int
main()
63
Employment Planning 動規小練
employment planning 原題鏈結 對於當前月份所需人數,和僱傭最大所需人數之間的情況進行討論。由於解雇金額和僱傭金額的存在,會存在一次性僱傭更多的人以減少解雇金額的情況,所以要討論到所需最大人數。include include include include include incl...
2016 7 13 樹形動規
rmq演算法講完沒幾個小時,我們就開始了小紫中的一節 足見這個演算法很重要 樹形動歸 1.焦作一中資訊學oy 2.小黃 資訊學奧賽一本通 3.小紫 演算法競賽入門經典第二版 題型總結 來自資料1 1 加分二叉樹 區間動規 樹的遍歷 2 二叉蘋果樹 二叉樹上的動規 3 最大利潤 多叉樹上的動規 4 選...
序列型動規
d i 中的i表示前i的元素的某種性質。有一排n棟房子,每棟房子要漆成k種顏色中的一種 任何兩棟相鄰的房子不能漆成同樣的顏色 房子i染成第j種顏色的花費是cost i j 問最少需要花多少錢油漆這些房子 輸入 n 3,k 3 cost 14,2,11 11,14,5 14,3,10 輸出 10 房子...