火神為了檢驗zone的力量,他決定單挑n個人。
由於火神訓練時間有限,最多只有t分鐘,所以他可以選擇一部分人來單挑,由於有麗子的幫助,他得到了每個人特定的價值,每個人的價值由乙個三元組(a,b,c)組成,表示如果火神在第x分鐘單挑這個人(x指單挑完這個人的時間),他就會得到a-b*x的經驗值,並且他需要c分鐘來打倒這個人。
現在火神想知道,他最多可以得到多少經驗值,由於火神本來就很笨,進入zone的瘋狂的火神就更笨了,所以他希望你來幫他計算出他最多可以得到多少經驗值。
第一行乙個正整數t,表示資料組數
對於每組資料,第一行為兩個正整數n和t,表示跟火神單挑的人的個數和火神的訓練時間。
下面n行,每行三個正整數ai,bi,ci,表示每個人的價值,含義見題目。
對於每組資料輸出一行乙個整數表示火神最多能得到多少經驗值
1 4 10
110 5 9
30 2 1
80 4 8
50 3 2
對於 20%的資料1≤n≤10
對於50%的資料1≤n≤18
對於100%的資料1≤n≤1000,1≤t≤3000,1≤ci≤t,ai≤10^6
保證n>200的資料組數不超過五組,其他的資料組數不超過10組
保證每個人貢獻的經驗值到訓練結束都不會變成負數
假設i,j連續,那麼它們交換順序的貢獻與它們之前和之後都無關且無影響
那麼如果i在前比j在前優,則 a[
i]−b
[i]∗
(k+c
[i])
+a[j
]−b[
j]∗(
k+c[
j]+c
[i])
i]−b
[i]∗
(k+c
[j])
+a[j
]−b[
j]∗(
k+c[
i]+c
[j])
然後自己yy簡化以後
發現答案只與b[
i]c[
i]有關,那就以這個為關鍵字排序,做揹包問題即可
#include
#include
#include
#define fo(i,a,b) for(int i=a;i<=b;i++)
#define db double
using
namespace
std;
int n,t,ans=0,ac,f[5000];
struct note;
note a[1010];
bool cnt(note a,note b)
int main()
}printf("%d\n",ans);
}}
NOIP2016提高組模擬 積木
比賽的時候用了個神奇的小暴力,本來打算拿40分,沒想到暴力出奇蹟,隨機資料下表現優良,居然碾過去了。暴力方法不講,只貼 僅供對拍。正解顯然要用狀態壓縮 看資料範圍 設fs i,0 1 2 s表示當前已選擇的積木集合,i表示在最上方的積木編號,0 1 2表示最上方的積木哪面朝上。轉移方程容易推導。暴力...
計數 NOIP2016提高A組模擬7 15
樣例輸入 2 10 樣例輸出 90資料範圍 剖解題目 題目說的很明了了。思路 求方案數,一般會設計道dp,規律之類的。解法 數字dp,設f i j 表示當前到了第i位,這一位的數字是j的方案數。自然有 f i j f i 1 l f i j 0 l k 且 l 0 and j 0 看到這位數,很明顯...
NOIP2016提高A組模擬9 2 單峰
問1 n,n個數的全排列中有多少個滿足單峰序列的性質,並把答案mod 1e9 7 這題還是很簡單的,一開始打了乙個50分的做法,然後發現答案就是2n 1,然後沒有發現輸入也會爆,於是就得了50分 我們容易發現峰一定是最大的那個數,我們把峰放到每乙個位置上,然後在往峰的左邊隨便填一些數,每種填數的方法...