SDUT oj 3005 打怪升级(内存搜索)
当比赛一直纠缠骑2如何做一个非常大的数量,数组不开啊。。。后来他们发现自己很傻啊,该数不超过最大10什么,这个上限就是力量100什么。。
。。
其它的就是记忆化搜索啊,还有就是加一点力量的瓶子当时就要用上。
打怪升级
Time Limit: 1000ms Memory limit: 262144K 有疑问?点这里^_^
题目描写叙述
对于多数 RPG 游戏来说,除了剧情就是打怪升级。本题的任务是用最短的时间取得全部战斗的胜利。这些战斗必须依照特定的顺序进行,每打赢一场。都可能会获得一些补药,用来提升力量。
本题仅仅有两种补药:“加 1 药” 和“乘 2 药” ,分别让你的力量值加 1 和乘以 2。
战斗时间取决于你的力量。
每场战斗能够用 6 个參数描写叙述: p1, p2, t1, t2, w1, w2。假设你的力量小于 p1,你将输掉战斗。假设你的力量大于 p2,须要 t2秒赢得战斗;假设力量位于 p1 和 p2(包含 p1 和 p2),战斗时间从 t1 线性递减到 t2。
比方 p1=50。 p2=75, t1=40。 t2=15,你的力量为 55,则战斗获胜须要 35 秒。
注意,战斗时间可能不是整数。最后两个參数 w1 和 w2 分别表示战斗胜利后获得的“加 1 药” 和“乘 2 药” 的数量。 注意,你不一定要立马使用这些补药,能够在须要的时候再用。但不能在战斗中使用补药。按顺序给出每场战斗的參数。输出赢得全部战斗所需的最短总时间。
战斗必须按顺序进行。且不能跳过不论什么一场战斗。
输入
输入最多包括 25 组測试数据。每组数据第一行为两个整数 n 和 p( 1<=n<=1000, 1<=p<=100),即战斗的场数和你的初始力量值。
下面 n 行每行 6 个整数 p1, p2, t1, t2, w1, w2( 1<=p11<=p1<p2<=100, 1<=t2<t1<=100,0<=w1,w2<=10),按顺序给出各场战斗的參数,输入结束标志为n=p=0
输出
对于每组数据,输出最短总时间(单位:秒)。保留两位小数。假设无解,输出“Impossible”(不含引號)。
演示样例输入
1 55
50 75 40 15 10 0
2 55
50 75 40 15 10 0
50 75 40 15 10 0
3 1
1 2 2 1 0 5
1 2 2 1 1 0
1 100 100 1 0 0
1 7
4 15 35 23 0 0
1 1
2 3 2 1 0 0
0 0
演示样例输出
35.00
60.00
41.00
31.73
Impossible
提示
#include <set>
#include <map>
#include <queue>
#include <math.h>
#include <vector>
#include <string>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <cctype>
#include <algorithm> using namespace std; const int maxn = 1010;
const double INF = 100000000.0; struct node
{
int p1, p2, t1, t2, w1, w2;
}f[maxn];
int n;
double dp[maxn][110][15]; double distime(node a, int x)
{
if(x >= a.p2) return a.t2*1.0;
double x1 = a.p1*1.0;
double y1 = a.t1*1.0;
double x2 = a.p2*1.0;
double y2 = a.t2*1.0;
double x3 = x*1.0;
return (x3*((y1-y2)/(x1-x2)) + (y1-x1*((y1-y2)/(x1-x2))));
} double dfs(int x, int w, int num)
{
if(x > n) return 0;
if(dp[x][w][num] > -1.0) return dp[x][w][num];
if(w < f[x].p1)
{
while(w < f[x].p2 && num)
{
w = min(100, w*2);
num--;
}
}
if(w < f[x].p1)
{
dp[x][w][num] = INF;
return dp[x][w][num];
}
dp[x][w][num] = INF;
for(int i = 0; i <= num; i++)
dp[x][w][num] = min(dp[x][w][num], distime(f[x], w<<i)+dfs(x+1, min((w<<i)+f[x].w1, 100), min(10, num-i+f[x].w2)));
return dp[x][w][num];
} int main()
{
int p;
while(~scanf("%d %d",&n, &p))
{
if(!n && !p) break;
for(int i = 1; i <= n; i++) scanf("%d %d %d %d %d %d",&f[i].p1, &f[i].p2, &f[i].t1, &f[i].t2, &f[i].w1, &f[i].w2);
memset(dp, -1, sizeof(dp));
dfs(1, p, 0);
double Min = INF;
for(int i = 1; i <= 100; i++) Min = min(dp[1][i][0], Min);
if(Min == INF) cout<<"Impossible"<<endl;
else printf("%.2lf\n",Min);
}
}
版权声明:本文博主原创文章。博客,未经同意不得转载。
SDUT oj 3005 打怪升级(内存搜索)的更多相关文章
- 1255: 打怪升级(Java)
WUSTOJ 1255: 打怪升级 Description 对于多数RPG游戏来说,除了剧情就是打怪升级.本题的任务是用最短的时间取得所有战斗的胜利.这些战斗必须按照特定的顺序进行,每打赢一场,都可能 ...
- Oracle打怪升级之路二【视图、序列、游标、索引、存储过程、触发器】
前言 在之前 <Oracle打怪升级之路一>中我们主要介绍了Oracle的基础和Oracle常用查询及函数,这篇文章作为补充,主要介绍Oracle的对象,视图.序列.同义词.索引等,以及P ...
- 从苦逼到牛逼,详解Linux运维工程师的打怪升级之路
做运维也快四年多了,就像游戏打怪升级,升级后知识体系和运维体系也相对变化挺大,学习了很多新的知识点. 运维工程师是从一个呆逼进化为苦逼再成长为牛逼的过程,前提在于你要能忍能干能拼,还要具有敏锐的嗅觉感 ...
- 运维工程师打怪升级进阶之路 V2.0
在此之前,发布过两个版本: 运维工程师打怪升级之路 V1.0 版本发布 运维工程师打怪升级必经之路 V1.0.1 很多读者伙伴们反应总结的很系统.很全面,无论是0基础初学者,还是有基础的入门者,或者是 ...
- 20190528-JavaScriptの打怪升级旅行 { 语句 [ 赋值 ,数据 ] }
写在前面的乱七八糟:今天考了试,emmm很基础的题,还是Mrs房的面试题让人绝望啊┓( ´∀` )┏,补了很多知识,很综合的题,坑也很多,总的来说,查漏补缺,其实是啥都缺~ 今天打的小BOSS主要是数 ...
- Flask连接数据库打怪升级之旅
一.前言 在初学 Flask 的时候,在数据库连接这部分也跟每个初学者一样.但是随着工作中项目接手的多了,代码写的多了,历练的多了也就有了自己的经验和技巧.在对这块儿代码不断的进行升级改造后,整理了在 ...
- SDUT OJ 2607
/*http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2607*/ 题目大意:给出一个字符串,求出里 ...
- SDUT OJ 1221 亲和数 (找出某个数n所有的因子数,只需要暴力:2->sqrt(n) 即可 )
亲和数 Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^ 题目描述 如果a的因子和等于b,b的因子和等于a,且a≠b,则称a,b为亲和数对. ...
- SDUT OJ 图练习-BFS-从起点到目标点的最短步数 (vector二维数组模拟邻接表+bfs , *【模板】 )
图练习-BFS-从起点到目标点的最短步数 Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^ 题目描述 在古老的魔兽传说中,有两个军团,一个叫天 ...
随机推荐
- Android中Broadcast Receiver组件具体解释
BroadcastReceiver(广播接收器)是Android中的四大组件之中的一个. 以下是Android Doc中关于BroadcastReceiver的概述: ①广播接收器是一个专注于接收广播 ...
- SVN冲突解决详解
在: http://blog.csdn.net/windone0109/article/details/4857044
- 控制台打印Hibernate的SQL语句显示绑定参数值
问题? 使用Hibernate提供的show_sql内置属性true只能输出类似于下面的SQL语句:Hibernate: insert into user(name,password) value ...
- 解决Android Device Chooser 找不到设备问题
第一种情况: 已经启动了官方的模拟器也进入了Android手机界面,可是在Android Device Chooser 看不到设备,怎么办? 例如以下图所看到的,使用Reset adb 或者在adb所 ...
- Unity3D之挥动武器产生的剑痕特效
网维教程网 观看很多其它教程 眼下已知3种方法能够做这样的剑痕特效 1.尾随特效 2.程序实现动态面来处理剑痕动画. 3.美术实现剑痕动画,直接坐在模型动画里面 (由于我不会美术所以这个忽略 嘿嘿) ...
- 【Unity Shaders】使用Unity Render Textures实现画面特效——画面特效中的亮度、饱和度和对照度
本系列主要參考<Unity Shaders and Effects Cookbook>一书(感谢原书作者),同一时候会加上一点个人理解或拓展. 这里是本书全部的插图. 这里是本书所需的代码 ...
- Yii/Yii2:查询返回以某特定列为索引(键)的数组
在Yii1.x中,要想查询语句返回以特定列为键(key)的数组数据,代码例如以下(下述样例以表主键为返回数组索引): $users = User::model()->findAll(array( ...
- Oracle SQL Lesson (4) - 使用转换函数和条件表达式
隐式转换select * from emp where empno='7788'字符(char,varchar2)转换为数字(number)或日期(date)数字或日期转换为字符 显式转换字符转换为数 ...
- 使用jni技术进行android应用签名信息核查及敏感信息保护
近期业余时间写了一款应用<摇啊摇>,安智.安卓.360等几个应用商店已经陆续审核通过并上线.从有想法到终于将产品做出来并公布,断断续续花了近二个半月的业余时间,整体来讲还算顺 ...
- ACM:回溯,八皇后问题,素数环
(一)八皇后问题 (1)回溯 #include <iostream> #include <string> #define MAXN 100 using namespace st ...