题目描述

小A最近迷上了在上课时玩《黄金矿工》这款游戏。为了避免被老师发现,他必须小心翼翼,因此他总是输。在输掉自己所有的金币后,他向你求助。每个黄金可以看做一个点(没有体积)。现在给出你N个黄金的坐标,挖到它们所需要的时间以及它们的价值。有些黄金在同一条直线上,这时候你必须按顺序挖。你可以瞬间把钩子转到任意角度。请你帮助小A算出在时间T内他最多可以得到多少价值的金子。

输入输出格式

输入格式:

第一行,两个整数N和T,表示黄金的个数和总时间。接下来N行,每行四个整数x,y,t,v分别表示黄金的坐标,挖到这个黄金的时间,以及这个黄金的价值。(0≤|x|≤200,0<y≤200,0<t≤200,0≤v≤200)

输出格式:

一个整数,表示你可以在T时间内得到的最大价值。

样例:

In                                   out

3  10

1  1  1  1

2  2  2  2

1 3 15 9

3
3 10
1 1 13 1
2 2 2 2
1 3 4 7                       
7

大体思路特殊的有依赖的背包通过一些奇技淫巧转化为分组背包

具体实现: 

先排序,把在一条线上的的黄金组成一个组,然后因为必须选了前面的的才可以选后面的,所以可以将它们转化前缀和的形式,每一个前缀和就是一个新的物品,然后分组背包处理即可。

丑陋的 AC代码:

#include<bits/stdc++.h>
using namespace std;
#define maxn 205
#define maxm 40005
#define eps 1e-6int n,m;
struct node
{int x,y,t,v;double K;//k为斜率
}con[maxn];bool cmp(node a,node b)
{if(abs(a.K-b.K) < eps)return a.x < b.x;return a.K < b.K;
}//先按照斜率排,再按坐标,可以在初始化的时候节约一些时间int v[maxn][maxn],t[maxn][maxn],f[maxm];//v,t分别为新的物品的价值和消耗
int pack[maxn],cnt;inline void start()//初始化
{sort(con+1,con+1+n,cmp);for(int i=1;i<=n;i++){if(abs(con[i].K-con[i-1].K) > eps||i==1)++cnt;if(pack[cnt]==0){v[cnt][++pack[cnt]]=con[i].v;t[cnt][pack[cnt]]=con[i].t;}else{++pack[cnt];v[cnt][pack[cnt]]=con[i].v+v[cnt][pack[cnt]-1];t[cnt][pack[cnt]]=con[i].t+t[cnt][pack[cnt]-1];}}
}inline void dp()//分组背包dp
{for(int i=1;i<=cnt;i++)for(int j=m;j>=t[i][1];j--){int now=f[j];for(int k=1;k<=pack[i];k++)if(j>=t[i][k])now=max(now,f[j-t[i][k]]+v[i][k]);f[j]=max(f[j],now);}
}int main()
{scanf("%d%d",&n,&m);for(int i=1;i<=n;i++){scanf("%d%d%d%d",&con[i].x,&con[i].y,&con[i].t,&con[i].v);con[i].K=(double)con[i].y/con[i].x;}start();dp();printf("%d\n",f[m]);return 0;
}
//有依赖的背包可以将价值,重量等写成前缀和的形式,然后当作分组背包除理

希望蒟蒻的思路可以帮到各位dalao

~~第一个解题报告不要介意~~

[TJOI2013]黄金矿工解题报告相关推荐

  1. 洛谷P3961 [TJOI2013]黄金矿工—C++

    题目 题目描述 小A最近迷上了在上课时玩<黄金矿工>这款游戏.为了避免被老师发现,他必须小心翼翼,因此他总是输.在输掉自己所有的金币后,他向你求助.每个黄金可以看做一个点(没有体积).现在 ...

  2. [TJOI2013]黄金矿工

    题目描述 小A最近迷上了在上课时玩<黄金矿工>这款游戏.为了避免被老师发现,他必须小心翼翼,因此他总是输.在输掉自己所有的金币后,他向你求助.每个黄金可以看做一个点(没有体积).现在给出你 ...

  3. 洛谷3961 [TJOI2013]黄金矿工

    题目描述 小A最近迷上了在上课时玩<黄金矿工>这款游戏.为了避免被老师发现,他必须小心翼翼,因此他总是输.在输掉自己所有的金币后,他向你求助.每个黄金可以看做一个点(没有体积).现在给出你 ...

  4. TJOI2013 黄金矿工(01背包改)

    题目描述 小A最近迷上了在上课时玩<黄金矿工>这款游戏.为了避免被老师发现,他必须小心翼翼,因此他总是输.在输掉自己所有的金币后,他向你求助.每个黄金可以看做一个点(没有体积).现在给出你 ...

  5. 洛咕 P3961 [TJOI2013]黄金矿工

    甚至都不是树形背包= = 把每条线抠出来,这一条线就是个链的依赖关系,随便背包一下 // luogu-judger-enable-o2 #include<bits/stdc++.h> #d ...

  6. 黄金矿工问题【动态规化】

    文章目录 黄金矿工 解题思路 递归实现 二维数组实现 一维数组实现 黄金矿工 很久很久以前,有一位国王拥有5座金矿,每座金矿的黄金储量不同,需要参与挖掘的工人人数也不同.例如有的金矿储量是500kg黄 ...

  7. 2016-11-17试题解题报告

    2016-11-17试题解题报告 By shenben 水灾(sliker.cpp/c/pas) 1000MS  64MB 大雨应经下了几天雨,却还是没有停的样子.土豪CCY刚从外地赚完1e元回来,知 ...

  8. LeetCode:1219.黄金矿工(Java语言)

    不要自卑,去提升实力 互联网行业谁技术牛谁是爹 如果文章可以带给你能量,那是最好的事!请相信自己 加油o~ 1219.黄金矿工 你要开发一座金矿,地质勘测学家已经探明了这座金矿中的资源分布,并用大小为 ...

  9. 久久未至的Codevs1024一塔湖图解题报告

    一直想给这个题写个解题报告但是给忘了OTZ难产了这么久终于出来了 这个题当时坑了我一个星期整,所以一定要写一个解题报告纪念一下 1024 一塔湖图 时间限制: 1 s 空间限制: 128000 KB ...

最新文章

  1. 环境变量、用户变量、系统变量
  2. python pptx 从中间加几页_python-pptx---插入表格
  3. [转]NYOJ-511-移动小球
  4. python gps模块_一步一步使用uPyCraft学习MicroPython之GPS记录器
  5. TIOBE 6月编程语言排行榜:Python势不可挡
  6. matlab在运筹学,MATLAB在运筹学(单纯形法)教学中的应用
  7. Linux 命令(15)—— umask 命令(builtin)
  8. 如何向普通人解释机器学习、数据挖掘
  9. zookeeper启动失败解决方法
  10. Spring Security入门教程
  11. 开机黑屏、自检不通过,主板检测卡代码为25问题解决
  12. 【python爬虫】爬取链家二手房数据
  13. 丰巢取快递系统(二)
  14. DirectX函数总结2
  15. 2022世界人工智能大会全记录
  16. 去爱一个无缘无故责备你的人,你就学到了生命的艺术。
  17. excel中统计每一行中指定字体颜色和填充颜色的单元格求和(不使用VBA)
  18. 逻辑归纳与数学归纳:皮亚诺公理5解读1——皮亚诺读后之七
  19. 如何读取PHD实时数据
  20. 密度聚类:OPTICS算法详解

热门文章

  1. AI人士不得不了解的十大机器算法
  2. c#加密证件号的中间部分,改为*号
  3. 串口示波器软件NS-Scope
  4. 激光雷达物体检测(二):点视图检测算法
  5. arcgis根据7参转坐标_ArcGIS坐标转换操作实战(反算七参数)
  6. python数据建模_Python数据模型
  7. 关于使用不同单片机 工程报错总结(STC12C5A60S2)
  8. 联想7y50服务器预装系统了吗,联想y50重装系统教程
  9. FreeModbus 移植(从机实现)
  10. 显卡显存测试u盘 mats_【茶茶】非公路在何方?AORUS RTX 2060测试报告