当前位置: 首页 > news >正文

2017百度之星资格赛 1003 度度熊与邪恶大魔王 背包DP

度度熊与邪恶大魔王

 
 Accepts: 3027
 
 Submissions: 18837
 Time Limit: 2000/1000 MS (Java/Others)
 
 Memory Limit: 32768/32768 K (Java/Others)
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

 

 

思路:

一看到每个技能能用无限次,就想到了用完全背包,算出打每个怪所需的最短时间,再加起来,敲出来后进行测试,10000个怪的时候用时就要 4秒了,肯定超。

后来留意了一下,每只怪最多1000 的血,10的防御,最多 10000 种怪,只需把打每种怪所需的最少晶石数量求出来就行了,最多用时 1000 * 10 * 1000 = 10^7,然后就水过去了0.0,用时187ms

dp[i][j] 表示打 i 血量 j 防御的怪最多需要用多少晶石

dp[i][j] = min(dp[i-(p[x]-j)][j] + k[x])    p[x] 表示第 x 种技能的攻击, k[x] 表示第 x 中技能消耗的晶石

代码:

#include <iostream>
#include <cstring>
using namespace std;

const int MAX = 100005;
const int INF = 0x3f3f3f3f;

int n, m;
int dp[1005][12];    //打血量为 i,防御为 j 的怪所需的最少晶石
int a[MAX], b[MAX];
int k[1005], p[1005];
int getK[1005];        //造成 i 伤害需要的晶石数量 

int main(){
//    freopen("input.txt", "r", stdin);
//    freopen("output.txt", "w", stdout);
    
    while(scanf("%d%d", &n, &m) == 2){
        int maxA = 0, maxB = 0;            //最多多少血量和防御 
        for(int i=1; i<=n; i++){
            scanf("%d%d", a+i, b+i);
            maxA = max(maxA, a[i]);
            maxB = max(maxB, b[i]);
        }
        memset(getK, 0x3f, sizeof(getK));
        for(int i=1; i<=m; i++){
            scanf("%d%d", k+i, p+i);
            if(getK[p[i]] <= k[i] || p[i] == 0){    //有更实惠的技能 
                m--; i--; continue;
            }
            getK[p[i]] = k[i];
        }
        
        memset(dp, 0x3f, sizeof(dp));
        for(int i=0; i<=10; i++){
            dp[0][i] = 0;        //怪物血量为 0 时,需要的晶石数量为 0 
        }
        for(int i=1; i<=maxA; i++){        //血量 
            for(int j=0; j<=maxB; j++){    //防御 
                for(int l=1; l<=m; l++){    //晶石 
                    int t = p[l] - j;        //能造成的伤害
                    if(t <= 0){                //如果不能造成伤害
                        continue; 
                    }
                    if(i >= t){            //如果一次打不死 
                        dp[i][j] = min(dp[i][j], dp[i-t][j] + k[l]);
                    }else{
                        dp[i][j] = min(dp[i][j], k[l]);
                    }
                }
            }
        }
        
        long long ans = 0;
        for(int i=1; i<=n; i++){
            if(dp[a[i]][b[i]] < INF){
                ans += dp[a[i]][b[i]];
            }else{
                ans = -1;
                break;
            }
        }
        
        cout << ans << endl;
    }
    
    return 0; 
} 

 

转载于:https://www.cnblogs.com/lighter-blog/p/7295242.html

相关文章:

  • 8086汇编之 CALL 和 RET指令
  • c# 多线程编程中AutoResetEvent和ManualResetEvent
  • 【Python】 配置文件相对路径软件自动执行的工作目录
  • [SDUT](3361) 数据结构实验之图论四:迷宫探索 ---DFS(图)
  • proxy汇总-1
  • 使用for循环输出九九乘法表
  • ffmpeg学习(二) 通过rtsp获取H264裸流并保存到mp4文件
  • 安装node.js和npm
  • 推荐几款谷歌浏览器的使用插件
  • webservcie学习之webservice是什么
  • Win10《芒果TV》更新v3.6.0秋收版:新增追剧磁贴、记忆续播、跳转列表
  • Centos7安装TensorFlow
  • 没有绝对的cc.ResolutionPolicy.FIXED_WIDTH或cc.ResolutionPolicy.FIXED_HEIGHT
  • Spring 定时任务之 @Scheduled cron表达式
  • Java内存知识整理
  • php的引用
  •  D - 粉碎叛乱F - 其他起义
  • Docker容器管理
  • eclipse(luna)创建web工程
  • export和import的用法总结
  • JavaScript设计模式之工厂模式
  • ReactNativeweexDeviceOne对比
  • Spring Cloud Feign的两种使用姿势
  • tweak 支持第三方库
  • uni-app项目数字滚动
  • 如何利用MongoDB打造TOP榜小程序
  • 深入 Nginx 之配置篇
  • 腾讯视频格式如何转换成mp4 将下载的qlv文件转换成mp4的方法
  • 一文看透浏览器架构
  • LevelDB 入门 —— 全面了解 LevelDB 的功能特性
  • ​ 全球云科技基础设施:亚马逊云科技的海外服务器网络如何演进
  • #我与Java虚拟机的故事#连载16:打开Java世界大门的钥匙
  • (04)odoo视图操作
  • (2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (JSP)EL——优化登录界面,获取对象,获取数据
  • (WSI分类)WSI分类文献小综述 2024
  • (笔试题)分解质因式
  • (附源码)ssm基于微信小程序的疫苗管理系统 毕业设计 092354
  • (附源码)ssm教师工作量核算统计系统 毕业设计 162307
  • (附源码)基于ssm的模具配件账单管理系统 毕业设计 081848
  • (牛客腾讯思维编程题)编码编码分组打印下标题目分析
  • (三) prometheus + grafana + alertmanager 配置Redis监控
  • (原創) 人會胖會瘦,都是自我要求的結果 (日記)
  • .net 7 上传文件踩坑
  • .Net CF下精确的计时器
  • .NET CORE 第一节 创建基本的 asp.net core
  • .NET Core/Framework 创建委托以大幅度提高反射调用的性能
  • .net mvc actionresult 返回字符串_.NET架构师知识普及
  • .net 设置默认首页
  • .net 中viewstate的原理和使用
  • .net 桌面开发 运行一阵子就自动关闭_聊城旋转门家用价格大约是多少,全自动旋转门,期待合作...
  • .netcore 如何获取系统中所有session_ASP.NET Core如何解决分布式Session一致性问题
  • .net反混淆脱壳工具de4dot的使用
  • ?.的用法
  • @Validated和@Valid校验参数区别