1. 程式人生 > >A - Altruistic Amphibians Gym - 101933A (貪心+dp)

A - Altruistic Amphibians Gym - 101933A (貪心+dp)

題意:坑裡有一堆青蛙,青蛙有身高、跳躍高度、體重。青蛙可以疊羅漢,但是不可以撐起超過自己體重的重量。問有多少青蛙可以跳出去。體重總和<=1e8

思路:因為最重的青蛙肯定不能出去,所以應該是保證體重輕的能出去,而重的在底下,所以,先按體重排序。

設dp[i]表示,體重為i的最大高度可以達到多少,那麼判斷dp[i]+h與d 的大小關係就知道這隻青蛙能否出去了。

因為能托起的青蛙不能超過最底下的青蛙重量,所以,每次都只會更新wi次。

程式碼:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+7;
int n=maxn,m=1e8+7;
int dp[maxn*1000];
int d;
struct Point
{
    int l,w,h;
}p[maxn];
bool cmp(Point a,Point b)
{
    return a.w>b.w;
}
int main()
{
    #ifndef ONLINE_JUDGE
        freopen("in.txt","r",stdin);
        freopen("out.txt","w",stdout);
    #endif
    scanf("%d%d",&n,&d);
    for(int i=1;i<=n;i++)
    {
        scanf("%d%d%d",&p[i].l,&p[i].w,&p[i].h);
    }
    sort(p+1,p+1+n,cmp);
    ll ans=0;
    for(int i=1;i<=n;i++)
    {
        if(dp[p[i].w]+p[i].l>d) ans++;
        for(int j=p[i].w+1;j<min(p[i].w*2,m);j++)
        {
            int w=p[i].w;
            dp[j-w]=max(dp[j-w],dp[j]+p[i].h);
        }
    }
    printf("%d\n",ans);
    return 0;
}