搖錢樹time limit:1000ms
memory limit:1000k
total submissions:106
accepted:33
description
cpg 正在遊覽乙個夢中之城,在這個城市中有n棵搖錢樹。。。這下,可讓cpg看傻了。。。可是cpg只能在這個城市中呆k天,但是現在搖錢樹已經成熟了,每天每棵都會掉下不同的金幣。cpg每天可以砍掉其中一顆,並獲得其樹上說有的金幣(怎麼會有這種好事。。。)。請你幫助cpg算出他在這k天中最多能獲得多少金幣。
input
每個檔案中有不超過10組測試資料。
每組測試資料:
第一行兩個整數n,k (1<=k<=n<=1000)
第二行n個整數mi (mi <= 100000).表示cpg剛看到這n棵樹時每刻樹上的金幣數。
第三行n個整數 bi.(bi<=1000)表示每顆搖錢樹,每天將會掉落的金幣。
以n=k=0結束。
output
對每組測試資料,輸出僅一行,cpg在k天中能獲得的最大金幣數。
sample input
3 310 20 30
4 5 6
4 320 30 40 50
2 7 6 5
0 0sample output
47104
題解:令dp[i][j]為前i棵樹砍j棵得到的最大值。
不過要按照掉錢的數量從高到低排個序。
證明:比較兩棵消耗速度分別為v1,v2,總價值為c1,c2的樹
令v1>v2,若在兩樹都一定要取的情況下,且間隔p天,之前過了t天
若先取v1,獲利為s1=c1+c2-p*v1-t*(v1+v2);
若先取v2,獲利為s2=c2+c1-p*v2-t*(v1+v2);
s1一定大於s2
所以要排序。。。
最後還要找一遍最大值。
還有就是m[i]-(j-1)*b[i]有可能是負值,所以要與0取max。
#include#include#include#includeusing namespace std;
typedef long long ll;
ll dp[1005][1005];
struct node
}e[1005];
int main()
} ll ans=0;
for(i=1;i<=k;i++)
cout<
洛谷 P1987 搖錢樹(貪心 dp)
原題鏈結 給定 n 棵搖錢樹,第 i 棵搖錢樹上的初始金幣為 a i 每天會掉下 b i 個金幣。在 k 天內,每天都可以砍一棵搖錢樹,第 i 天砍第 j 棵搖錢樹可以得到 a j i 1 b j 個金幣,求最終得到的金幣數量的最大值。首先可以將題目中的 k 天看成是乙個容量為 k 的揹包,第 j ...
洛谷 P1987 搖錢樹 揹包dp 貪心
cpg 正在遊覽乙個夢中之城,在這個城市中有n棵搖錢樹。這下,可讓cpg看傻了。可是cpg只能在這個城市中呆k天,但是現在搖錢樹已經成熟了,每天每棵都會掉下不同的金幣 不屬於cpg!cpg每天可以砍掉其中一顆,並獲得其樹上說有的金幣 怎麼會有這種好事。請你幫助cpg算出他在這k天中最多能獲得多少金幣...
貪心DP 田忌賽馬
田忌賽馬 描述 description 中國古代的歷史故事 田忌賽馬 是為大家所熟知的。話說齊王和田忌又要賽馬了,他們各派出n匹馬,每場比賽,輸的一方將要給贏的一方200兩 如果是平局的話,雙方都不必拿出錢。現在每匹馬的速度值是固定而且已知的,而齊王出馬也不管田忌的出馬順序。請問田忌該如何安排自己的...