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 有疑问?点这里^_^ 题目描述 在古老的魔兽传说中,有两个军团,一个叫天 ...
随机推荐
- VS2010升级VS2013后,出现没有定义类型“PowerPacks.ShapeContainer”错误解决方法
开发说明: http://msdn.microsoft.com/zh-tw/library/microsoft.visualbasic.powerpacks.aspx Microsoft.Visual ...
- 解决backgroud:transparent在低版本浏览器中的bug
今天在html页面上定义了一个button和一个div,大小相同,button使用绝对定位,覆盖在div上面一层,同时样式设置背景透明(background:transparent). 这样就可以在看 ...
- 【Android Training - UserInfo】记住登入用户的信息[Lesson 1 - 使用AccountManager来记住用户]
Remembering Your User[记住你的用户] 每一个人都非常喜欢自己的名字能被人记住.当中最简单,最有效的使得你的app让人喜欢的方法是记住你的用户是谁,特别是当用户升级到一台新的设备或 ...
- Hdu 5073 Galaxy 精度问题
思路: 其实求解很简单直接说解法,移动K个后 上下的角动量最小,能肯定是相连的(n-k)个,至于为什么 你自己好好想想(easy): 对于一些等质量的质点中心在 所在位置和除以点的个数 average ...
- [置顶] 最优间隔分类器、原始/对偶问题、SVM的对偶问题——斯坦福ML公开课笔记7
转载请注明:http://blog.csdn.net/xinzhangyanxiang/article/details/9774135 本篇笔记针对ML公开课的第七个视频,主要内容包括最优间隔分类器( ...
- 【leetcode】LRU
import java.util.HashMap; import java.util.Map; public class LRUCache { private int capacity; privat ...
- Windows 8 应用开发 - 本地数据存储
原文:Windows 8 应用开发 - 本地数据存储 在应用中通常会遇到用户主动或被动存储信息的情况,当应用关闭后这些数据仍然会存储在本地设备上,用户下次重新激活应用时会自动加载这些数据.下 ...
- unity3D实际的原始视频游戏开发系列讲座12之U3D的2D为了开发实战的新方法
U3D的2D为了开发实战的新方法 (Unity3d-4.x的打飞机2D游戏开发新的方法应用 ) 大纲介绍:不使用NGUI和TK2d插件, 使用 U3D内置强大的最大的工具. 开发过程设计到例 ...
- Jenkins详细安装与构建部署使用教程(转)
Jenkins是一个开源软件项目,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能.Jenkins是基于Java开发的一种持续集成工具,用于监控持续重复的工作,功能包括:1.持续的软件版本发布 ...
- unicode下一个,读取数据库乱码问题
TCHAR cbContent[512]; dyn.GetFieldValue(0,cbContent,512); // 中文会显示乱码 AfxMessageBox(cbConte ...