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;
}

猜你喜欢

转载自blog.csdn.net/qq_40774175/article/details/83479636