2018-2019 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2018)A. Altruistic Amphibians(贪心+dp)

A. Altruistic Amphibians

题意:

输入 n ( 1 e 5 ) , d ( 1 e 18 ) n(1e5),d(1e18) n(1e5),d(1e18)
接下来 n n n行,每行 l , w , h l,w,h l,w,h表示每只青蛙的跳跃高度、承重 ( < w ) ((<w),青蛙高度。
坑的高度为 d d d,必须跳到大于 d d d才算跳出,问最多有几个青蛙能跳出去。

题解:

贪心:从最大承重开始考虑,一直往小,计算青蛙是否能跳出去。
d p dp dp: 如何计算?这里就要用 d p dp dp算法了, d p [ w ] dp[w] dp[w]表示能够承重 w w w叠起来的青蛙的最大高度。如果 l + d p [ w ] > d l+dp[w]>d l+dp[w]>d,那么它就能跳出去,然后更新(转移) d p dp dp方程
d p [ i ] = m a x ( d p [ i ] , d p [ i + w ] ) ( 1 ≤ i < w ) dp[i]=max(dp[i],dp[i+w])(1\leq idp[i]=max(dp[i],dp[i+w])(1i<w)

代码:

#include
using namespace std;
const int N=1e8+9;
const int M=1e5+9;
struct T{
    int l,w,h;
}a[M];
int dp[N];
int n,d;
bool cmp(T t1,T t2){return t1.w>t2.w;}
int main(){
  //  freopen("tt.in","r",stdin),freopen("tt.out","w",stdout);
    cin>>n>>d;
    for(int i=1;i<=n;i++)cin>>a[i].l>>a[i].w>>a[i].h;
    sort(a+1,a+n+1,cmp);
    int ans=0;
    for(int i=1;i<=n;i++){
        ans+=(a[i].l+dp[a[i].w]>d);
        for(int j=1;j<a[i].w;j++){dp[j]=max(dp[j],(j+a[i].w<N?dp[j+a[i].w]:0)+a[i].h);if(dp[j]>d)dp[j]=d;}
    }
    cout<<ans<<endl;
    return 0;
}

你可能感兴趣的:(贪心,dp)