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);
    }
}

版权声明:本文博主原创文章。博客,未经同意不得转载。

时间: 2024-10-07 09:24:14

SDUT oj 3005 打怪升级(内存搜索)的相关文章

SDUT oj 3005 打怪升级(记忆化搜索)

比赛的时候一直在纠结乘2的数目很大怎么办,数组开不开啊...后来才发现自己傻了啊,那个数目最大不会超过10啊,这个力量上限是100啊.... 其他的就是记忆化搜索啊,还有就是加一点力量的瓶子当时就要用上. 打怪升级 Time Limit: 1000ms   Memory limit: 262144K  有疑问?点这里^_^ 题目描述 对于多数 RPG 游戏来说,除了剧情就是打怪升级.本题的任务是用最短的时间取得所有战斗的胜利.这些战斗必须按照特定的顺序进行,每打赢一场,都可能会获得一些补药,用来

SDUT OJ 1704 数字统计问题

SDUT OJ 1704 数字统计问题 博客原文地址:http://blog.csdn.net/xuechelingxiao/article/details/40930259 昨天晚上学弟问了OJ上这个题,群里说不清楚,就写个解题报告吧. 题目大意: 中文题目,就不翻译了-.- 解题思路: 不知道算不算一个典型的数位DP,反正有点那个意思,感觉确实也可以用记忆话搜索,两个差不多的意思. 我找了一下,这个问题好像是算法设计与实验题解上面的一道题,别的OJ上没有,所以就在自己OJ上做了. 大体的思路

nyist oj 58 最少步数(dfs搜索)

最少步数 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 这有一个迷宫,有0~8行和0~8列: 1,1,1,1,1,1,1,1,1 1,0,0,1,0,0,1,0,1 1,0,0,1,1,0,0,0,1 1,0,1,0,1,1,0,1,1 1,0,0,0,0,1,0,0,1 1,1,0,1,0,1,0,0,1 1,1,0,1,0,1,0,0,1 1,1,0,1,0,0,0,0,1 1,1,1,1,1,1,1,1,1 0表示道路,1表示墙. 现在输入一个道路的坐标作为

【转载】运维职业向!我是怎么入得运维行业?运维工程师入门必备技能以及打怪升级篇

前言:转载 陈浩一个从事安全运维向的前辈文章.写的很好.人非常nice,遇到了问题,qq上很快就回复了我. 大道三千 入门最难,凡事入了行,也就什么都好说了,好的自然不断努力奋斗修行,不好的自然很快就被淘汰.恭谨勤勉,时不我待~ ---------------------------------------------------------------------------------------------------------------------------------------

详解Linux运维工程师打怪升级篇

详解 Linux 运维工程师打怪升级篇 积累经验篇 做运维也快4年多了,就像游戏打怪升级,升级后知识体系和运维体系也相对变化挺大,学习了很多新的知识点. 运维工程师 是从一个呆逼进化为苦逼再成长为牛逼的过程,前提在于你要能忍能干能拼,还要具有敏锐的嗅觉感知前方潮流变化.如:今年大数据,人工智能比较火...(相对表示就是 python 比较火) 前面也讲了运维基础篇,发现对很多人收益挺大,接下来也写下关于这4年多的运维实践经验,从事了2年多游戏运维,1年多安全运维,1年大数据运维,相关行业信息不能

20190528-JavaScriptの打怪升级旅行 { 语句 [ 赋值 ,数据 ] }

写在前面的乱七八糟:今天考了试,emmm很基础的题,还是Mrs房的面试题让人绝望啊┓( ´∀` )┏,补了很多知识,很综合的题,坑也很多,总的来说,查漏补缺,其实是啥都缺~ 今天打的小BOSS主要是数据,但也不得不提到赋值,┓( ´∀` )┏ 语句:声明  变量  赋值   数据: 3.赋值 在说赋值方式之前,需要先引入js的数值类型:基本类型和引用类型(boss4会细剖),下面我就假装都懂这俩个小怪的区别了,开始我一本正经的吹~,咳,一本正经地打怪升级了. 现象: 解析:莫得慌,一步步来,首先

SDUT OJ 3045 迷之图论 (树的直径)

题目地址:SDUT OJ 3045 这题比赛的时候想的差不多..但是总是觉得不对..写了一次就没再写,然后删了..当时没想到的是第二次求出来的就是最长链..当时想到的两次bfs找最大值(这一种方法其实结果也对..TAT..),还有找到点后在回溯减去重点等等..但总觉得好像都不太对...赛后才知道这题原来是树的直径.....牡丹江区域现场赛的时候遇到过,不过赛后也没看... 找树的直径的方法其实就是先任取一点进行bfs,找到最远的一点,这时最远的一点肯定是最长链端点之一,然后再从这一最远点开始bf

三分之一的程序猿之创业组队与打怪升级

历史       历史是惊人的相似,曾几何时我还是大学网吧中众多逃课来玩游戏的其中一个. 我做事的是风格是疯狂,不到南墙不回头的风格.只在我迷上了<魔兽世界>是暴雪出品的一款MMORPG类经典游戏,即大型多人在线角色扮演游戏.进入大学后,松散的大学风格一下让自己反复来到了自由的天堂.我的定位是一位PVP玩家,在我还是菜鸟的时候,我需要做的就是寻找一个队伍进入竞技场. 70级版本,要想进入竞技场首先要做的第一件事情就是找人签名.也就意味着需要找到分工明确的5个人组成一个队伍,我当队长. 我70级

SDUT OJ -2892 A

A Time Limit: 60ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 给出n(1<= n && n <= 2*10^6)个字符串,每个字符串只包含小写英文字母,且最多有五个.问这n个字符串中出现次数最多的有多少个. 输入 单组输入.第一行输入一个数字n,接下来n行,每行包含一个字符串. 输出 输出一个数字代表答案. 示例输入 5 aba abb w aba z 示例输出 2 提示 字段树,模板题 #include <iost