zoukankan      html  css  js  c++  java
  • 度度熊与邪恶大魔王

     

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=6082

    Problem Description
    度度熊为了拯救可爱的公主,于是与邪恶大魔王战斗起来。
    
    邪恶大魔王的麾下有n个怪兽,每个怪兽有a[i]的生命值,以及b[i]的防御力。
    
    度度熊一共拥有m种攻击方式,第i种攻击方式,需要消耗k[i]的晶石,造成p[i]点伤害。
    
    当然,如果度度熊使用第i个技能打在第j个怪兽上面的话,会使得第j个怪兽的生命值减少p[i]-b[j],当然如果伤害小于防御,那么攻击就不会奏效。
    
    如果怪兽的生命值降为0或以下,那么怪兽就会被消灭。
    
    当然每个技能都可以使用无限次。
    
    请问度度熊最少携带多少晶石,就可以消灭所有的怪兽。
     
    
    Input
    本题包含若干组测试数据。
    
    第一行两个整数n,m,表示有n个怪兽,m种技能。
    
    接下来n行,每行两个整数,a[i],b[i],分别表示怪兽的生命值和防御力。
    
    再接下来m行,每行两个整数k[i]和p[i],分别表示技能的消耗晶石数目和技能的伤害值。
    
    数据范围:
    
    1<=n<=100000
    
    1<=m<=1000
    
    1<=a[i]<=1000
    
    0<=b[i]<=10
    
    0<=k[i]<=100000
    
    0<=p[i]<=1000
     
    
    Output
    对于每组测试数据,输出最小的晶石消耗数量,如果不能击败所有的怪兽,输出-1
     
    
    Sample Input
    1 2
    3 5
    7 10
    6 8
    1 2
    3 5
    10 7
    8 6
     
    
    Sample Output
    6
    18
     
    
    Source
    2017"百度之星"程序设计大赛 - 资格赛
    题干
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #define LL long long
    using namespace std;
    const LL INF=1e18+7;
    LL n,m,f[155][5507];
    LL maxp,max1,max2,ans,mn;
    LL a[100007],b[100007],v[100007],p[100007];
    void first(){
        for(int i=0;i<=max2;i++)
         for(int j=1;j<=max1+maxp;j++)
          f[i][j]=INF;
        for(int k=0;k<=max2;k++)
            for(int i=1;i<=m;i++){
                LL now=p[i]-(LL)k;
                if(now<=0) continue;
                for(int j=1;j<=maxp+max1;j++){
                    if(j-now>=0) f[k][j]=min(f[k][j],f[k][j-now]+v[i]);
                    else f[k][j]=min(f[k][j],v[i]);
                }
            }
    }
    int main()
    {
        while(scanf("%lld %lld",&n,&m)!=EOF)
        {
            maxp=max1=max2=ans=mn=0;
            for(int i=1;i<=n;i++)
            {
                scanf("%lld%lld",&a[i],&b[i]),
                max1=max(a[i],max1),max2=max(max2,b[i]);
            }
            for(int i=1;i<=m;i++)
            {
                scanf("%lld%lld",&v[i],&p[i]);
                maxp=max(maxp,p[i]);
            }
            if(max2>=maxp)
            {
                printf("-1
    ");
                continue;
            }
            
            first();
            for(int i=1;i<=n;i++)            
                ans+=f[b[i]][a[i]];
            
            printf("%lld
    ",ans);
        }
        return 0;
    }
    代码

    数据怎么大,有像背包(有递推性质),那就dp吧。

    f[i][j]表示要杀掉防御为i,生命为j的怪兽需要的水晶。

    dp时要注意:如果不能破防,就不要用该技能啦。

  • 相关阅读:
    系列文章--突袭HTML5之Javascript
    arguments对象的实例使用
    Javascript常用的设计模式详解
    javascript日历插件
    系列文章--AJAX技术系列总结
    零基础汇编学习笔记
    VC++6.0注释快捷键的添加使用
    VC6++常用快捷键
    汇编题目:编写包含多个功能子程序的中断例程
    汇编题目:按A键,当松开的时显示字母A
  • 原文地址:https://www.cnblogs.com/CLGYPYJ/p/7390466.html
Copyright © 2011-2022 走看看