zoukankan      html  css  js  c++  java
  • 2017"百度之星"程序设计大赛

    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
    解法:
    1 dp[i][j]表示i点防御力,j点伤害时花费最小的代价,一看就知道是完全背包
     1 #include <iostream>
     2 #include <stdio.h>
     3 #include <math.h>
     4 #include <cstring>
     5 #include <map>
     6 #include <set>
     7 #include <algorithm>
     8 #include <queue>
     9 #include <stack>
    10 using namespace std;
    11 long long dp[15][1100];
    12 long long INF=(long long)1e18;
    13 int A[110000],B[110000];
    14 int K[110000],P[110000];
    15 int n,m;
    16 int main(){
    17     while(~scanf("%d%d",&n,&m)){
    18         long long sum=0;
    19         for(int i=0;i<=15;i++){
    20             for(int j=0;j<=1100;j++){
    21                 dp[i][j]=INF;
    22             }
    23         }
    24         for(int i=1;i<=n;i++) scanf("%d%d",&A[i],&B[i]);
    25         for(int i=1;i<=m;i++) scanf("%d%d",&K[i],&P[i]);
    26         for(int i=0;i<=10;i++){
    27             dp[i][0]=0;
    28             for(int j=1;j<=m;j++){
    29                 if(P[j]<i) continue;
    30                 for(int z=1;z<=1000;z++){
    31                     int ans=max(z-(P[j]-i),0);
    32                     dp[i][z]=min(dp[i][z],(long long)dp[i][ans]+K[j]);
    33                 }
    34             }
    35         }
    36         int flag=0;
    37         for(int i=1;i<=n;i++){
    38             if(dp[B[i]][A[i]]==INF){
    39                 flag=1;
    40                 break;
    41             }
    42             sum+=dp[B[i]][A[i]];
    43         }
    44         if(flag){
    45             cout<<"-1"<<endl;
    46         }else{
    47             cout<<sum<<endl;
    48         }
    49     }
    50     return 0;
    51 }
  • 相关阅读:
    js Dom为页面中的元素绑定键盘或鼠标事件
    javascript中DOM获取和设置元素的内容、样式及效果
    第四十一节 固定在顶部的悬停菜单
    第四十节 定位练习
    第三十九节 层级定位
    第三十八节 固定定位
    第三十七节 绝对定位
    第三十六节 相对定位
    第三十五节 定位
    第三十四节 新闻标题练习
  • 原文地址:https://www.cnblogs.com/yinghualuowu/p/7300520.html
Copyright © 2011-2022 走看看