2017百度之星程序设计大赛 - 资格赛:1003 度度熊与邪恶大魔王
题目:
度度熊为了拯救可爱的公主,于是与邪恶大魔王战斗起来。
邪恶大魔王的麾下有n个怪兽,每个怪兽有a[i]的生命值,以及b[i]的防御力。
度度熊一共拥有m种攻击方式,第i种攻击方式,需要消耗k[i]的晶石,造成p[i]点伤害。
当然,如果度度熊使用第i个技能打在第j个怪兽上面的话,会使得第j个怪兽的生命值减少p[i]-b[j],当然如果伤害小于防御,那么攻击就不会奏效。
如果怪兽的生命值降为0或以下,那么怪兽就会被消灭。
当然每个技能都可以使用无限次。
请问度度熊最少携带多少晶石,就可以消灭所有的怪兽。
本题包含若干组测试数据。
第一行两个整数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
对于每组测试数据,输出最小的晶石消耗数量,如果不能击败所有的怪兽,输出-1
1 2 3 5 7 10 6 8 1 2 3 5 10 7 8 6
6 18
思路:这道题也是坑,WA了好多次,做了一下午...建立两个数组,dp[i][j]表示表示消灭防御为j生命值为i的怪物需要消耗多少水晶,num[i][j]表示表示防御为j生命值为i的怪物有多少只。利用dp不断更新找到消耗水晶数的最小值。至于不能击败所有的怪兽,只需考虑不破防的情况就行了(最大攻击力<=最小防御力 or 最大攻击力<=最大防御力--->最大攻击力<=最大防御力)。由于数据问题,选用__int64或long long输出答案为佳,中间也可以加一些剪枝来节省时间。。。
CODE:
#include<bits/stdc++.h>
using namespace std;
__int64 dp[1005][11],num[1005][11],sum;
int sk[1005];
struct node
{int k,p;
}q[1005];
int main()
{int n,m,i,j,l,a,b,len;while(~scanf("%d%d",&n,&m)){memset(dp,0,sizeof(dp));memset(num,0,sizeof(num));memset(sk,0,sizeof(sk));int min_b=15,max_a=0,max_b=0,max_p=0;for(i=0;i<n;i++){scanf("%d%d",&a,&b);num[a][b]++;min_b=min(min_b,b);max_a=max(max_a,a);max_b=max(max_b,b);}len=0;while(m--){scanf("%d%d",&a,&b);if(b<=min_b) continue;if(sk[b]&&sk[b]<=a) continue;sk[b]=a;q[len].k=a;q[len++].p=b;max_p=max(max_p,b);}m=len;if(max_p<=max_b){puts("-1");continue;}for(l=0;l<=10;l++){for(i=1;i<=max_a;i++){__int64 cnt=-1;for(j=0;j<m;j++){int op=q[j].p-l;if(op<=0)continue;if(i-op<=0){if(cnt==-1||cnt>q[j].k) cnt=q[j].k;continue;}if(cnt==-1||cnt>dp[i-op][l]+q[j].k) cnt=dp[i-op][l]+q[j].k;}dp[i][l]=cnt;}}sum=0;for(i=1;i<=max_a;i++) for(j=0;j<=10;j++) sum+=dp[i][j]*num[i][j];printf("%I64d\n",sum);}return 0;
}
2017百度之星程序设计大赛 - 资格赛:1003 度度熊与邪恶大魔王相关推荐
- 【2017百度之星程序设计大赛 - 资格赛】 度度熊与邪恶大魔王
[Link]: [Description] [Solution] 因为技能的效果和花费是不会变的; 所以,考虑预处理m个技能达成一定的伤害最少需要的魔法石数量; 可以把对这m个技能做一个类似的完全背包 ...
- 2017百度之星 资格赛1003度度熊与邪恶大魔王
1003度度熊与邪恶大魔王 Accepts: 1503 Submissions: 9026 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 3 ...
- 2017百度之星程序设计大赛 - 资格赛【1001 Floyd求最小环 1002 歪解(并查集),1003 完全背包 1004 01背包 1005 打表找规律+卡特兰数】...
度度熊保护村庄 Accepts: 13 Submissions: 488 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/3276 ...
- 2017百度之星程序设计大赛-资格赛
ACM模版 忙里偷闲的写了几道题,这两天好忙啊--只过一道题就能通过资格赛,所以并没有什么签到题--但是的确有的题被我想难了~~~ 1002-度度熊的王国战略 >>>并查集<& ...
- 2017百度之星资格赛—1003度度熊与邪恶大魔王
其他题目就不发博客了(有些也没做出来!!),感觉这次百度之星资格赛题目数据有毒,吐槽,其他题目也不好说,感觉这个题目正常点. 这个题目我当时想到的就是动态规划,但是评论中很多人说是贪心,我一直不理解, ...
- 度度熊与邪恶大魔王(2017百度之星程序设计大赛 - 资格赛)
度度熊与邪恶大魔王 Accepts: 1764 Submissions: 10691 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: ...
- 2017百度之星资格赛 1003 度度熊与邪恶大魔王
本题我们可以类比背包 背包dp[i][j] 表示再有i个物品下j个空间所获得的最大价值 本题dp[i][j] 可以表示干掉i个血量j个防御力下的最小花费 我们看其实我们就是在不同血量之间转移 如果当前 ...
- 百度之星资格赛1003 度度熊与邪恶大魔王(dp)--2017
度度熊与邪恶大魔王 Problem Description 度度熊为了拯救可爱的公主,于是与邪恶大魔王战斗起来. 邪恶大魔王的麾下有n个怪兽,每个怪兽有a[i]的生命值,以及b[i]的防御力. 度度熊 ...
- 百度之星2017资格赛1003 度度熊与邪恶大魔王
Problem Description 度度熊为了拯救可爱的公主,于是与邪恶大魔王战斗起来. 邪恶大魔王的麾下有n个怪兽,每个怪兽有a[i]的生命值,以及b[i]的防御力. 度度熊一共拥有m种攻击方式 ...
最新文章
- 【转】CEC文件详解
- [Android Traffic] 使用缓存来避免重复的下载
- pc构件生产线及设备_PC构件成组立模生产线
- Linux系统——架构浅析
- reloaddata 跳动_纸跳动像素
- Page.ClientScript.RegisterArrayDeclaration
- [转载] opengl能做什么_python能做什么
- linux web部署命令简单记录
- JS layer时间组件laydate的回调中重置清除选择无效的问题
- MMI、SS、USSD介绍
- 谷歌浏览器安装插件的方法
- 每个星座的出生日期php,php根据出生日期计算年龄 生肖 星座程序
- Lombok requires enabled annotation processing
- CSS 3之 文本样式(三)
- RC电路的充放过程C语言实现,RC电路的瞬态和稳态过程
- 跨平台跨端的登录流程及其安全设计
- 电脑网易云音乐,网易云音乐的话题区到底有多魔性?
- 常见的爬虫error以及解决方法
- 高校借助电子签章推动学生入网缴费凭证、科研项目拨款单在线签
- Fortran编程快速入门
热门文章
- Q10:调试QTI综测源码
- 版本控制之Git---简介
- uniapp 设置 style 动态背景
- Apache IoTDB 毕业两周年庆典|限量版纪念T恤“点击”就送~
- 数据分析技能点-Word使用的40个常规操作
- java银行自助系统结构图_java毕业设计_springboot框架的基于框架的银行大厅自助信息系统...
- 垂直行业网站destoon系统如何开启伪静态urlrewrite
- 9.2NOIP模拟赛
- [时序波动关联]模型CoFLUX论文要点整理
- 如何在Adobe XD中创建酒店预订UI设计