A - Altruistic Amphibians Gym - 101933A (貪心+dp)
阿新 • • 發佈:2018-11-08
題意:坑裡有一堆青蛙,青蛙有身高、跳躍高度、體重。青蛙可以疊羅漢,但是不可以撐起超過自己體重的重量。問有多少青蛙可以跳出去。體重總和<=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; }