题目概述

题目描述

魔兽争霸3中,战略资源的采集通过使用农民、苦工、小精灵以及寺僧来进行。

在魔兽争霸4的开发中,玻璃渣觉得这种模式太过单一,于是他们想添加更多的单位来使采集的模式更加丰富。

在新的模式中,玩家可以建造更多种类的“苦工”,不同的“苦工”的工作效率不同,同时,建造不同的“苦工”所需要的资源也是不一样的。

玻璃渣出品的游戏以追求平衡著称,所以为了测试这种新的模式的平衡性,他们设计了一套检测的方法:在各种族的起始资源相同时,测量达到某一资源数量的时间,如果相同则可以认为设计是平衡的。

他们将数据给你,希望你能测试出设计是否平衡。

输入格式

第一行三个数,\(N, M, T\), 表示苦工的种类、开始时拥有的资源数量以及需要达到的资源的数量。

接下来\(N\)行,每行\(2\)个数\(A, B\), 表示生产这种苦工所需要的资源,以及这个苦工的效率,效率即为单位时间内产生的资源的数量。

输出格式

一个数字,表示资源数量达到T时的最少时间。

注意:与魔兽争霸3不同,魔兽争霸4中,生产苦工不需要时间。并且资源的采集并不连续,亦即如果一个苦工的效率为\(2\),他会在时间为\(1\)的时候收获\(2\)点资源,而并不会在时间为\(0.5\)的时候收获\(1\)点资源。

输入输出样例

输入 #1
1 1 8
1 1
输出 #1
4
输入 #2
2 1 8
1 1
2 8
输出 #2
3

数据范围

对于\(30 \%\)的数据,\(N \le 10, M, T \le 300\)

对于\(100 \%\)的数据,\(N \le100,M, T \le 1000, A, B \le 2^{31}\)

数据保证有解

解题报告

题意理解

  1. 就是有若干类苦力,每一个苦力有一个,每秒生产力,和购买需要花费的资源.苦力可以无限购买

  2. 初始的时候,你有一些资源,且问你达到目标资源数量的最少时间.

  3. 购买苦力是不需要花费时间.

算法解析

这道题目是极为罕见的两次DP算法.

首先我们需要,固定花费\(x\)资源,可以购买最大的生产力为多少.

\[f[x]表示花费x个资源,购买的最大生产力
\]

  1. 每一个苦力看作一个物品
  2. 每一个苦力,可以无限购买
  3. 要求固定的资源,购买最大的生产力

其实这个就是完全背包问题.


然后我们考虑,对于有固定的资源数量,在一个固定的时间内,所拥有的最大生产力

\[f2[t][x]表示t个时间内,拥有x个资源的最大生产力
\]

那么我们显然是要,购买生产力

那么,假设我们花费\(k\)个资源,那么得到最大多少生产力?

\[f[k]
\]

这就是我们上次完全背包的产物.

那么下一秒,我们会拥有多少资源呢.

\[w=(j-k)+(f[k])+(f2[i][j]) \\\\下一秒资源=剩余资源+本次新来生产力制造的资源+原本就有的生产力制造的资源
\]

那么根据本次推导,下一秒最大生产力为多少呢?

\[f2[i+1][w]=max(f2[i+1][w],f[k]+f2[i][j]);
\]

既然如此,我们就成功的推导出来了,第二次的线性动态规划算法.


代码解析

#include <bits/stdc++.h>
using namespace std;
const int N=1100;
int a[N],b[N],f[N],f2[N][N],n,m,ed;
inline void init()
{
scanf("%d%d%d",&n,&m,&ed);
for(int i=1; i<=n; i++)
scanf("%d%d",&a[i],&b[i]);
if (m>=ed)
{
puts("0");
return ;
}
memset(f,-1,sizeof(f));//消耗j点资源,可以得到的最大生产力
f[0]=0;
for(int i=1; i<=n; i++)
for(int j=a[i]; j<=1000; j++)//完全背包转移
if (f[j-a[i]]!=-1)
f[j]=max(f[j],f[j-a[i]]+b[i]);
memset(f2,-1,sizeof(f2));//-1是为了处理是否拥有这么多资源
f2[0][m]=0;//初始化,f2[i][j]表示i单位时间后剩下j资源能拥有的最大生产力。
for(int i=0; i<=1000; i++)//i时刻
{
if (f2[i][ed]!=-1)//存在这种方案
{
printf("%d\n",i);
return ;
}
for(int j=0; j<=ed; j++)//当前拥有j点资源
{
if(f2[i][j]==-1)//判断是否当前拥有这么多资源
continue;
for(int k=0; k<=j; k++)//花费k点能量购买生产力
{
if (f[k]==-1) //要保证k可以制造生产力
continue;
int w=(j-k)+(f[k])+(f2[i][j]);//剩余资源+本次新来生产力制造的资源+原本就有的生产力制造的资源=下一秒资源
if (w>=ed)//发现找到了
{
printf("%d\n",i+1);
return ;
}
f2[i+1][w]=max(f2[i+1][w],f[k]+f2[i][j]);//本次购买生产力+原本拥有的生产力
}
}
}
}
signed main()
{
init();
return 0;
}

[GDOI2014]采集资源的更多相关文章

  1. 洛谷 P3887 [GDOI2014]世界杯

    P3887 [GDOI2014]世界杯 题目描述 3014年世界杯足球赛就要开始了!作为卫冕冠军中国足球队的教练,手下每位球员都是猛将,如何摆出最强的11人阵容也是一件幸福的烦恼事啊. 众所周知,足球 ...

  2. 分享各大CMS采集资源站网址合集

    分享各大CMS采集资源站网址合集 http://www.172zy.xyz/ 172云资源 http://www.dbzyz.com/ 豆瓣云资源 http://www.gaoqingzy.com/ ...

  3. 【GDOI2014模拟】JZOJ2020年8月14日提高组 服务器

    [GDOI2014模拟]JZOJ2020年8月14日提高组 服务器 题目 Time and Memory Limits Description 我们需要将一个文件复制到n个服务器上,这些服务器的编号为 ...

  4. 【GDOI2014模拟】JZOJ2020年8月14日T2 网格

    [GDOI2014模拟]JZOJ2020年8月14日T2 网格 题目 Time and Memory Limits Description 某城市的街道呈网格状,左下角坐标为A(0, 0),右上角坐标 ...

  5. 【GDOI2014 DAY2】Beyond (扩展KMP)

    [题目] [题意] Jodie和Aiden在做游戏.Jodie在一个长度为l字符串环上走路,他每离开一个就会记下格子当前字符.他让Aiden在他走了一圈后叫他停下来.Aiden决定耍一下Jodie,在 ...

  6. GDOI2014模拟pty爬山(mountain)

    pty爬山(mountain) 在Pty学校附近,有一座名之为岳之麓的高山.Pty很喜欢和(哔--)一起爬山.山的平面模型如下:山由一个顶点集:A1,A2-An给定,保证Ai的x单调递增.我们将Ai和 ...

  7. GDOI2014模拟 旅行【SPFA】

    旅行(travel) 从前有一位旅者,他想要游遍天下所有的景点.这一天他来到了一个神奇的王国:在这片土地上,有n个城市,从1到n进行编号.王国中有m条道路,第i条道路连接着两个城市ai,bi,由于年代 ...

  8. 拯救莫莉斯[GDOI2014]

    时间限制:1s     内存限制:256MB 问题描述 莫莉斯·乔是圣域里一个叱咤风云的人物,他凭借着自身超强的经济头脑,牢牢控制了圣域的石油市场. 圣域的地图可以看成是一个n*m的矩阵.每个整数坐标 ...

  9. 【[GDOI2014]拯救莫莉斯】

    可能我的状态比较鬼畜,应该没有人这么写 设\(dp[i][j][k]\)表示在第\(i\)行,放置油库的状态为\(j\),实际上周围已经有油库或者本身有油库的状态为\(k\)的时候的最小花费 由于我们 ...

随机推荐

  1. Docker镜像仓库Harbor搭建

    园子里面已经有人写过了.也写得很好,我这里只记录下我遇到的问题 Harbor 依赖: 1:docker 2:docker-compose 怎么安装就不说了. 然后是安装Harbor github:ht ...

  2. 排序算法三:Shell插入排序

    排序算法三:Shell插入排序 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 引言 在我的博文<"主宰世界"的10种算法短评> ...

  3. 用gcd库函数求最大公约数

    如何直接调用库函数来求最大公约数呢? 1.首先看怎样求两个数的最大公约数 要注意gcd()前面是两个“_” !!! #include<bits/stdc++.h> using namesp ...

  4. 2、2 唯一验证,这里我们强调后台的唯一验证&在保存之前进行验证

    后台 —————————————————————————————————————————————— @RequestMapping("/uniqueNameCheck") publ ...

  5. MySQL 配置参数优化

    MySQL 配置参数优化 1.修改back_log参数值:由默认的50修改为500 back_log=500back_log值指出在MySQL暂时停止回答新请求之前的短时间内多少个请求可以被存在堆栈中 ...

  6. U1. 广度优先搜索(BFS)和 广度优先搜索(DFS)

    广度优先搜索用栈(stack)来实现,整个过程可以想象成一个倒立的树形: 1.把根节点压入栈中. 2.每次从栈中弹出一个元素,搜索所有在它下一级的元素,把这些元素压入栈中.并把这个元素记为它下一级元素 ...

  7. Redis(1.16)Redis监控为什么是单线程?为什么快?

    [1]Redis的高并发和快速原因 1.redis是基于内存的,内存的读写速度非常快: 2.redis是单线程的,省去了很多上下文切换线程的时间: 3.redis使用多路复用技术,可以处理并发的连接. ...

  8. C#中输入法全角转换半角

    一般情况下,我们都是使用英文半角的来进行编程,包括输入框和密码框的设定一般也是英文半角,但往往有些人使用全角输入,登陆不进去还以为你系统错误,现整理了几种全角切换半角和设定输入法的几种方法. 方法一: ...

  9. plsql中文乱码 显示问号

    输入sql语句select * from V$NLS_PARAMETERS查看字符集,查看第一行value值是否为简体中文 解决方案: 新增环境变量 变量名: NLS_LANG 变量值: SIMPLI ...

  10. LC 3. Longest Substring Without Repeating Characters

    题目描述 Given a string, find the length of the longest substring without repeating characters. Example ...