zoukankan      html  css  js  c++  java
  • HDU

    度度熊与邪恶大魔王

    度度熊为了拯救可爱的公主,于是与邪恶大魔王战斗起来。 

    邪恶大魔王的麾下有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


    思路详见代码。

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include<math.h>
    #define MAX 1005
    #define INF 0x3f3f3f3f
    #define MOD 1000000007
    using namespace std;
    typedef long long ll;
    
    int dp[15][2005];
    int a[100005],b[100005];
    int k[1005],p[1005];
    int max(int x,int y){
        return x>y?x:y;
    }
    int min(int x,int y){
        return x<y?x:y;
    }
    int main()
    {
        int n,m,i,j,l;
        while(~scanf("%d%d",&n,&m)){
            memset(dp,INF,sizeof(dp));
            int maxa=0,maxb=0;
            for(i=1;i<=n;i++){
                scanf("%d%d",&a[i],&b[i]);
                maxa=max(maxa,a[i]);
                maxb=max(maxb,b[i]);
            }
            for(i=1;i<=m;i++){
                scanf("%d%d",&k[i],&p[i]);
            }
            for(i=0;i<=maxb;i++){
                dp[i][0]=0;
                for(j=1;j<=m;j++){
                    if(p[j]>i){
                        for(l=0;l<=maxa;l++){
                            if(p[j]-i>l) dp[i][l]=min(dp[i][l],k[j]);
                            else dp[i][l]=min(dp[i][l],dp[i][l-(p[j]-i)]+k[j]);
                        }
                    }
                }
            }
            ll ans=0;int f=0;
            for(i=1;i<=n;i++){
                if(dp[b[i]][a[i]]==INF){
                    f=1;
                    break;
                }
                ans+=dp[b[i]][a[i]];
            }
            if(f==1) printf("-1
    ");
            else printf("%I64d
    ",ans);
        }
        return 0;
    }
  • 相关阅读:
    Leetcode:50. Pow(x, n)
    loj 2759「JOI 2014 Final」飞天鼠
    bzoj 3569 DZY Loves Chinese II
    CF407D Largest Submatrix 3
    bzoj 3837 pa2013 Filary
    bzoj 4722 由乃
    CF1105E Helping Hiasat
    loj 6043「雅礼集训 2017 Day7」蛐蛐国的修墙方案
    luogu P2605 [ZJOI2010]基站选址
    luogu P3226 [HNOI2012]集合选数
  • 原文地址:https://www.cnblogs.com/yzm10/p/9337580.html
Copyright © 2011-2022 走看看