CSU 2249 Altruistic Amphibians DP

今天是这个学期第一场湖南多校训练赛,打的是真的自闭。

这个题是这场比赛的A题,想了n久,最后还是GG

题目链接:http://acm.csu.edu.cn:20080/csuoj/problemset/problem?pid=2249

题目大意,有n只青蛙想从一个深度为d的井中跳出去,因此青蛙需要叠罗汉。青蛙有3个属性,体重,身高,和跳跃力。叠罗汉唯一一个限制就是每只青蛙身上的青蛙的体重之和不能超过自身的体重。青蛙的跳跃力加上身下的青蛙的身高之和如果严格大于d,青蛙就能跳出去。
n<1e5, ∑ 体 重 &lt; 1 e 8 , d &lt; 1 e 8 \sum体重&lt;1e8,d&lt;1e8 <1e8d<1e8
看到这个题,数据范围这么大,完全不敢往dp想,虽然时限给了6s。直到有人说了是dp都觉得不可思议。
比赛的时候想到了总的叠起来的青蛙不会超过30只。。貌似没什么卵用。

正解是dp。

dp[i]表示的是能承重w的最大高度(注意这里是承重,不是下面青蛙的总重量)。
dp前需要将青蛙按体重从大到小排序,因为重的青蛙肯定不能在轻的青蛙上面。
因此转移方程就是dp[j]=max(dp[j],h[i]+dp[w[i]+j])(for j in range[1,wi-1])

完整代码:

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
const int M=1e8+5;
int dp[M];
struct node{
    int w,l,h;
}p[N];
const bool cmp(node n1,node n2){
    return n1.w>n2.w;
}
int main(){
    int n,h;
    scanf("%d%d",&n,&h);
    for(int i=0;i<n;i++){
        scanf("%d%d%d",&p[i].l,&p[i].w,&p[i].h);
    }
    sort(p,p+n,cmp);
    int ans=0;
    for(int i=0;i<n;i++){
        if(dp[p[i].w]+p[i].l>h){
            ans++;
        }
        for(int j=1;j<p[i].w&&j+p[i].w<M;j++){
            dp[j]=max(dp[j],p[i].h+dp[j+p[i].w]);
        }
    }
    printf("%d\n",ans);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值