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的长木板和一些小木棒,每一根小木棒有它的长度和价值,这些小木棒要放在长木板上 ...
随机推荐
- 18.java设计模式之中介者模式
基本需求 智能家庭包括各种设备,闹钟.咖啡机.电视机.窗帘等 要看电视时,各个设备可以协同工作,自动完成看电视的准备工作,比如流程为:闹铃响起->咖啡机开始做咖啡->窗帘自动落下-> ...
- 你不知道的Linux目录
Linux二级目录及其对应的作用 主要文件
- 洛谷P1972 [SDOI2009]HH的项链(树状数组)
题目链接: https://www.luogu.org/problemnew/show/P1972 题目描述: HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后 ...
- ctfhub技能树—信息泄露—git泄露—index
打开靶机 查看页面信息 使用dirsearch进行扫描 使用githack工具处理git泄露情况 使用git log命令查看历史记录 与 add flag 9b5b58-- 这次提交进行比对 即可拿到 ...
- [Usaco2005 Mar]Out of Hay 干草危机
题目描述 Bessie 计划调查N (2 <= N <= 2,000)个农场的干草情况,它从1号农场出发.农场之间总共有M (1 <= M <= 10,000)条双向道路,所有 ...
- centos7制作U盘启动盘-九五小庞
一.准备相关软件 1.8G以上U盘 2.UltraISO虚拟光驱(试用版即可)最新版 下载地址:https://cn.ultraiso.net/xiazai.html 点击下载试用 3.CentOS ...
- uni-app请求uni.request封装使用
对uni.request的一些共同参数进行简单的封装,减少重复性数据请求代码.方便全局调用. 先在目录下创建 utils 和 common 这2个文件夹 utils 是存放工具类的,common 用来 ...
- Bitter.Core系列十:Bitter ORM NETCORE ORM 全网最粗暴简单易用高性能的 NETCore 之 Log 日志
Bitter 框架的 Log 全部采用 NLog 日志组件.Bitter.Core 的 执行语句的日志记录 Nlog 日志级别为:info. 如果想要查看Bitter.Core 的执行SQL,先要去 ...
- CSRF Laravel Cross Site Request Forgery protection¶
Laravel 使得防止应用 遭到跨站请求伪造攻击变得简单. Laravel 自动为每一个被应用管理的有效用户会话生成一个 CSRF "令牌",该令牌用于验证授权用 户和发起请求者 ...
- 1.4.1 对象与JSON转化 1.4.2 JSON与List集合转化 1.1.1 获取json中的属性 day10-05
1.1.1 对象与JSON转化 @Test public void toJSON() throws IOException{ Jedis jedis = new Jedis("192.168 ...