博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[TJOI2013]黄金矿工解题报告
阅读量:4047 次
发布时间:2019-05-25

本文共 1944 字,大约阅读时间需要 6 分钟。

题目描述

小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
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 

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

转载地址:http://guuci.baihongyu.com/

你可能感兴趣的文章
DIV/CSS:一个贴在左上角的标签
查看>>
Solr及Spring-Data-Solr入门学习
查看>>
Vue组件
查看>>
python_time模块
查看>>
python_configparser(解析ini)
查看>>
selenium学习资料
查看>>
<转>文档视图指针互获
查看>>
从mysql中 导出/导入表及数据
查看>>
HQL语句大全(转)
查看>>
几个常用的Javascript字符串处理函数 spilt(),join(),substring()和indexof()
查看>>
javascript传参字符串 与引号的嵌套调用
查看>>
swiper插件的的使用
查看>>
layui插件的使用
查看>>
JS牛客网编译环境的使用
查看>>
9、VUE面经
查看>>
关于进制转换的具体实现代码
查看>>
Golang 数据可视化利器 go-echarts ,实际使用
查看>>
mysql 跨机器查询,使用dblink
查看>>
mysql5.6.34 升级到mysql5.7.32
查看>>
dba 常用查询
查看>>