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 有疑问?点这里^_^ 题目描述 在古老的魔兽传说中,有两个军团,一个叫天 ...
随机推荐
- The mell hall——坑爹
The mell hall 题目描述 In HUST,there are always manystudents go to the mell hall at the same time as soo ...
- PyUnit框架学习
http://www.oschina.net/question/12_27127#INSTALL http://www.360doc.com/content/11/0606/23/54470_1221 ...
- 参数化测试--sheet表的应用
自动化测试对录制和编辑好的测试步骤进行回放,这种是线性的自动化测试方式,其缺点是明显的,就是其测试覆盖面比较低.测试回放的只是录制时做出的界面操作,以及输入的测试数据,或者是脚本编辑时指定的界面操作和 ...
- Mvc后台接收 参数
@Html.TextAreaFor(m => m.Emps, new { @class = "easyui-validatebox", @style = "heig ...
- bat脚本命令
注:本文转载地址 http://www.cnblogs.com/yefengmeander/archive/2011/12/01/2887978.html 1.Echo 命令 打开回显或关闭请求回显 ...
- lua学习笔记11:lua中的小技巧
lua中的小技巧,即基础lua语言本身的特种,进行一个些简化的操作 一. 巧用or x = x or v 等价于: if not x then x = v end 假设x为nil或false,就给他赋 ...
- iterator pattern
6 迭代器模式总结 迭代器模式是一种使用频率非常高的设计模式,通过引入迭代器可以将数据的遍历功能从聚合对象中分离出来,聚合对象只负责存储数据,而遍历数据由迭代器来完成.由于很多编程语言的类库都已经实现 ...
- hdu2993坡dp+二进制搜索
MAX Average Problem Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
- 使用 Cordova+Visual Studio 创建跨平台移动应用(2)
目前开发移动应用有三种模式:Native.Hybird.Web,若要开发跨平台的移动应用,又希望与本地API交互,那么Hybird是一个非常好的选择. 作为一个.Net程序员,可以使用熟悉 ...
- 初探ExtJS(2)
二.建立第一个Demo.实现查数据库显示到页面 步骤:1.建立MySQL数据库表 2.整合SSH框架 3.用ExtJS显示 关键注意事项: Ext.data.JsonReader中root的含义,比如 ...