P8806 [蓝桥杯 2022 国 B] 搬砖

原题链接

请跟着我假设的情景走:

我现在随便拿一块砖 A 放在地上,接着我又拿了一块砖 B
请问,B 是放在 A 上面好,还是放在 A 下面好?

分类讨论

  • b.v<a.w,a.vb.w 此时 B 能且只能放在 A 的上面,此时 a.vb.v>b.wa.wa.v+a.w>b.v+b.w

  • b.v<a.w,a.v<b.w 此时 B 没法和 A 放在一起

  • b.va.w,a.v<b.w 此时 B 能且只能放在 A 的下面,此时 b.va.v>a.wb.wb.v+b.w>a.v+a.w

  • b.va.w,a.vb.w 此时 B 放哪都可以,但是放在哪里更好呢?
    如果 a.vb.w>b.va.w 则说明把 B 放在 A 上面更好,AB 之间可以插入更多砖块
    AB 之外的砖块放置不会因为 AB 的顺序改变而改变
    因为放在 AB 上面的砖块质量 Wmin(a.v,b.v)
    放在 AB 下面的砖块价值 Va.w+b.w

综上所述,如果砖块 i 只能放在砖块 j 的下面,或者放在砖块 j 的下面更好 ,则必有 i.v+i.wj.v+j.w

code

#include<bits/stdc++.h>
using namespace std;
struct node
{
    int w,v;
}b[1105];
bool cmp(node x,node y)
{
    return x.w+x.v<=y.w+y.v;
}
int dp[2000005];
int main()
{
    int n;
    cin>>n;

    for(int i=1;i<=n;i++)
    {
        cin>>b[i].w>>b[i].v;
    }



    sort(b+1,b+1+n,cmp);
    memset(dp,-1,sizeof dp);

    dp[0]=0;
    int ans=0;
    for(int i=1;i<=n;i++)
    {
        for(int j=b[i].v;j>=0;j--)
        {
            if(dp[j]!=-1)
            {
                dp[j+b[i].w]=max(dp[j+b[i].w],dp[j]+b[i].v);
                ans=max(ans,dp[j+b[i].w]);
            }
        }
        //for(int j=1;j<=10;j++)printf("%d : %d\n",j,dp[j]);
        //puts("");

    }
    cout<<ans;
    return 0;

}

posted @   纯粹的  阅读(11)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示