UESTC 1218 Pick The Sticks
Time Limit: 15000/10000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others)
Status
The story happened long long ago. One day, Cao Cao made a special order called "Chicken Rib" to his army. No one got his point and all became
very panic. However, Cao Cao himself felt very proud of his interesting idea and enjoyed it.
Xiu Yang, one of the cleverest counselors of Cao Cao, understood the command Rather than keep it to himself, he told the point to the whole army.
Cao Cao got very angry at his cleverness and would like to punish Xiu Yang. But how can you punish someone because he's clever? By looking at
the chicken rib, he finally got a new idea to punish Xiu Yang.
He told Xiu Yang that as his reward of encrypting the special order, he could take as many gold sticks as possible from his desk. But he could only
use one stick as the container.
Formally, we can treat the container stick as an L length
segment. And the gold sticks as segments too. There were many gold sticks with different
length ai and
value vi.
Xiu Yang needed to put these gold segments onto the container segment. No gold segment was allowed to be overlapped.
Luckily, Xiu Yang came up with a good idea. On the two sides of the container, he could make part of the gold sticks outside the container as long
as the center of the gravity of each gold stick was still within the container. This could help him get more valuable gold sticks.
As a result, Xiu Yang took too many gold sticks which made Cao Cao much more angry. Cao Cao killed Xiu Yang before he made himself home. So
no one knows how many gold sticks Xiu Yang made it in the container.
Can you help solve the mystery by finding out what's the maximum value of the gold sticks Xiu Yang could have taken?
Input
The first line of the input gives the number of test cases, T(1≤T≤100). T test
cases follow. Each test case start
with two integers, N(1≤N≤1000)
and L(1≤L≤2000),
represents the number of gold sticks and the length
of the container stick. N lines
follow. Each line consist of two integers, ai(1≤ai≤2000)
and vi(1≤vi≤109),
represents the length and the value of the ith gold
stick.
Output
For each test case, output one line containing Case, where x is
#x: y
the test case number (starting from 1)
and y is
the maximum value of the gold sticks Xiu Yang could have taken.
Sample input and output
| Sample Input | Sample Output |
|---|---|
4 3 7 |
Case #1: 2 |
Hint
In the third case, assume the container is lay on x-axis
from 0 to 5.
Xiu Yang could put the second gold stick center at 0 and
put the third gold stick
center at 5,
so none of them will drop and he can get total 2+9=11 value.
In the fourth case, Xiu Yang could just put the only gold stick center
on any position of [0,1],
and he can get the value of 3
题意:给你一根长为m的长木板和一些小木棒,每一根小木棒有它的长度和价值,这些小木棒要放在长木板上并且每一根小木棒的重心要在长木板上
(即可以露出一半的长),问最大价值是多少。
思路:主要是dp方程要想到,用dp[i][j][k]表示处理到第i根木棒,长木板用了j的长度,有k根露在外面的最大价值,因为对于每根木棒,有三种情况,
一种是不放,一种是放在木板里面,还有一种是放在木板外面。这里注意要用滚动数组,不然会超内存。
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<stack>
#include<string>
#include<algorithm>
using namespace std;
typedef long long ll;
#define inf 0x7fffffff
#define maxn 4005
ll l[maxn],v[maxn];
ll dp[2][maxn*2][3];
int main()
{
int n,m,i,j,T,len,cas=0;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
m*=2;
for(i=1;i<=n;i++){
scanf("%lld%lld",&l[i],&v[i]);
l[i]*=2;
}
memset(dp,0,sizeof(dp));
for(i=1;i<=n;i++){
//不放
for(j=0;j<=m;j++){
dp[1][j][0]=dp[0][j][0];
dp[1][j][1]=dp[0][j][1];
dp[1][j][2]=dp[0][j][2];
}
//放里面
for(j=m;j>=l[i];j--){
dp[1][j][0]=max(dp[1][j][0],dp[0][j-l[i] ][0]+v[i]);
dp[1][j][1]=max(dp[1][j][1],dp[0][j-l[i] ][1]+v[i]);
dp[1][j][2]=max(dp[1][j][2],dp[0][j-l[i] ][2]+v[i]);
}
//放外面
for(j=m;j>=l[i]/2;j--){
dp[1][j][1]=max(dp[1][j][1],dp[0][j-l[i]/2 ][0]+v[i]);
dp[1][j][2]=max(dp[1][j][2],dp[0][j-l[i]/2 ][1]+v[i]);
}
for(j=0;j<=m;j++){
dp[0][j][0]=dp[1][j][0];
dp[0][j][1]=dp[1][j][1];
dp[0][j][2]=dp[1][j][2];
}
}
ll ans=dp[1][m][0];
ans=max(ans,dp[1][m][1]);
ans=max(ans,dp[1][m][2]);
for(i=1;i<=n;i++){
ans=max(ans,v[i]);
}
cas++;
printf("Case #%d: %lld\n",cas,ans);
}
}
UESTC 1218 Pick The Sticks的更多相关文章
- ACM学习历程—UESTC 1218 Pick The Sticks(动态规划)(2015CCPC D)
题目链接:http://acm.uestc.edu.cn/#/problem/show/1218 题目大意就是求n根木棒能不能放进一个容器里,乍一看像01背包,但是容器的两端可以溢出容器,只要两端的木 ...
- DP(01背包) UESTC 1218 Pick The Sticks (15CCPC C)
题目传送门 题意:长度为L的金条,将n根金棍尽可能放上去,要求重心在L上,使得价值最大,最多有两条可以长度折半的放上去. 分析:首先长度可能为奇数,先*2.然后除了两条特殊的金棍就是01背包,所以dp ...
- CDOJ 1218 Pick The Sticks
Pick The Sticks Time Limit: 15000/10000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others ...
- uestc oj 1218 Pick The Sticks (01背包变形)
题目链接:http://acm.uestc.edu.cn/#/problem/show/1218 给出n根木棒的长度和价值,最多可以装在一个长 l 的容器中,相邻木棒之间不允许重叠,且两边上的木棒,可 ...
- The 2015 China Collegiate Programming Contest D.Pick The Sticks hdu 5543
Pick The Sticks Time Limit: 15000/10000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others ...
- 2015南阳CCPC D - Pick The Sticks dp
D - Pick The Sticks Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 无 Description The story happened lon ...
- 2015南阳CCPC D - Pick The Sticks 背包DP.
D - Pick The Sticks Description The story happened long long ago. One day, Cao Cao made a special or ...
- 2015 CCPC D- Pick The Sticks(UESTC 1218) (01背包变形)
http://acm.uestc.edu.cn/#/problem/show/1218 既然二维dp表示不了,就加一维表示是否在边界放置,放置一个,两个.有一个trick就是如果只放一根,那么多长都可 ...
- hdu 5543 Pick The Sticks(动态规划)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5543 题意:给你一根长为m的长木板和一些小木棒,每一根小木棒有它的长度和价值,这些小木棒要放在长木板上 ...
随机推荐
- .NET 调整图片尺寸(Resize)各种方法
本文中如无特别说明 .NET 指 .NET 5或者更高版本,代码同样可用于 .NET Core 前言 调整图片尺寸最常用的场景就是生成缩略图,一般为保持纵横比缩小,如果图片放大会使图片变得模糊,如果确 ...
- SQLI-LABS复现通关
sql-lab 复现通关(深入学习) less-1 基于错误的单引号字符串 - 正常访问 127.0.0.1/?id=1 - 添加 ' 返回报错信息:You have an error in your ...
- 面试官:Netty的线程模型可不只是主从多Reactor这么简单
笔者看来Netty的内核主要包括如下图三个部分: 其各个核心模块主要的职责如下: 内存管理 主要提高高效的内存管理,包含内存分配,内存回收. 网通通道 复制网络通信,例如实现对NIO.OIO等底层JA ...
- MySQL select 子查询的使用
### 子查询 >where 这个值是计算出来的 >本质:`在 where 语句中嵌套一个子查询语句` ```sql /*============== 子查询 ============== ...
- Java 使用 mail.jar 实现邮件发送
目录 准备工作 使用到的 jar 包 实现代码 准备工作 要想实现邮件发送, 需要先打开发送邮箱的 POP3/SMTP 服务,打开方式在 设置>帐户 中去打开,打开之后如果是qq邮箱会获得一个授 ...
- 【栈和队列】5、队列概述与数组队列的基本实现 - Java
3-5 数组队列 简单记录 - bobo老师的玩转算法系列–玩转数据结构 - 栈和队列 队列Queue 队列也是一种线性结构 相比数组,队列对应的操作是数组的子集 只能从一端(队尾)添加元素,只能从另 ...
- Mac中安装Git
Mac 安装git 打开Mac终端输入git命令 如果出现以下代码说明已经安装 usage: git [--version] [--help] [-C <path>] [-c <na ...
- 解决Python内CvCapture视频文件格式不支持问题
解决Python内CvCapture视频文件格式不支持问题 在读取视频文件调用默认的摄像头cv.VideoCapture(0)会出现下面的视频格式问题 CvCapture_MSMF::initStre ...
- 自翻------Office 2013 RT 使用说明
Office Home and Student 2013 RT Preview的更新 介绍 Microsoft已发布Microsoft Office Home and Student 2013 RT ...
- jackson学习之四:WRAP_ROOT_VALUE(root对象)
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...