题目传送门

题意:有n个金矿,每个金矿有抓取的消耗的时间和价值,矿工在原点,问在T时间内能得到的最大的价值

分析:唯一和01背包不同的是金矿可能共线,也就是抓取近的金矿后才能抓后面共线的金矿。这是分组背包问题,方法是将点按照斜率排序,如果相等按照距离原点远近排序,将斜率相等的点分成一组,每组的点累加上前面的点的时间和价值,这样每组只选一个点,就是01背包了

收获:分组背包问题

代码:

/************************************************
* Author :Running_Time
* Created Time :2015-8-27 8:48:05
* File Name :J.cpp
************************************************/ #include <cstdio>
#include <algorithm>
#include <iostream>
#include <sstream>
#include <cstring>
#include <cmath>
#include <string>
#include <vector>
#include <queue>
#include <deque>
#include <stack>
#include <list>
#include <map>
#include <set>
#include <bitset>
#include <cstdlib>
#include <ctime>
using namespace std; #define lson l, mid, rt << 1
#define rson mid + 1, r, rt << 1 | 1
typedef long long ll;
const int N = 2e2 + 10;
const int INF = 0x3f3f3f3f;
const int MOD = 1e9 + 7;
const double eps = 1e-6;
struct Point {
int x, y, t, v;
bool operator < (const Point &r) const {
if (y * r.x == x * r.y) return y < r.y;
else return y * r.x < x * r.y;
}
bool operator == (const Point &r) const {
return y * r.x == x * r.y;
}
}p[N];
int dp[40010];
vector<Point> block[N]; int main(void) {
int n, T, cas = 0;
while (scanf ("%d%d", &n, &T) == 2) {
for (int i=1; i<=n; ++i) {
scanf ("%d%d%d%d", &p[i].x, &p[i].y, &p[i].t, &p[i].v);
}
sort (p+1, p+1+n); int cnt = 0;
for (int i=1; i<=n; ++i) block[i].clear ();
block[++cnt].push_back (p[1]);
for (int i=2; i<=n; ++i) {
if (p[i] == p[i-1]) block[cnt].push_back (p[i]);
else block[++cnt].push_back (p[i]);
}
for (int i=1; i<=cnt; ++i) {
for (int j=1; j<block[i].size (); ++i) {
block[i][j].t += block[i][j-1].t;
block[i][j].v += block[i][j-1].v;
}
} memset (dp, 0, sizeof (dp));
for (int i=1; i<=cnt; ++i) {
for (int j=T; j>=0; --j) {
for (int k=0; k<block[i].size (); ++k) {
if (j >= block[i][k].t)
dp[j] = max (dp[j], dp[j-block[i][k].t] + block[i][k].v);
}
}
} printf ("Case %d: %d\n", ++cas, dp[T]);
} return 0;
}

  

最新文章

  1. 【Alpha】Daily Scrum Meeting第五次
  2. 【hihoCoder 1036】Trie图
  3. Android View坐标Left, Right, Top, Bottom
  4. Openstack的mysql数据多主galera的错误
  5. ActiveMQ 学习笔记
  6. 用上新的电脑装上了VS2013了
  7. sgu 104 Little Shop of Flowers
  8. Ajax--1
  9. Windows Server 2008 R2 安装及配置指南
  10. django基本命令备忘录
  11. JS年月日三级联动下拉框日期选择代码
  12. LeetCode 339. Nested List Weight Sum (嵌套列表重和)$
  13. HDU-5421Victor and String
  14. Python全栈开发之---redis数据库
  15. ssh-copy-id 拷贝用户秘钥
  16. BZOJ1856 [Scoi2010]字符串 数论
  17. 使用Maven搭建SpringMVC
  18. [报错]ios开发 failed to read file attributes for
  19. C++ 智能指针shared_ptr的实现
  20. 去除DataTable指定列的重复行

热门文章

  1. 系统优化(一)Maven打包同一个jar有不同的:版本号+时间戳(解决思路)
  2. 初始VueJS视频
  3. 安装和配置Apache-tomcat
  4. Java入门 第一季第五章 编程练习解析
  5. hdoj 1533 Going Home 【最小费用最大流】【KM入门题】
  6. 工作总结 js 选择器选择多条元素 支持一起设置他们属性 $(&quot;#edumes input[type=&#39;radio&#39;]&quot;).prop(&quot;checked&quot;, false);
  7. jQuery选择器特殊字符与属性空格问题
  8. iOS音频播放 (四):AudioFile 转
  9. 针对OpenSSL吐嘈的吐嘈-如此唱反调
  10. 2016/05/15 ThinkPHP3.2.2 表单自动验证实例 验证规则的数组 直接写在相应的控制器里