HDU 4563 御剑术I(背包)
2016-02-10 01:24
369 查看
Problem Description
在众多武侠类游戏中,都可以看到主角衣袂飘飘地在一旁通过“气”操控剑在空中飞行来杀伤敌人的帅气场景。
“十年磨一剑,霜刃未曾试”,在刻苦练习了不知道多少个日夜之后,今天你也掌握了这一项高超的武艺。虽然你可以并行地控制多柄剑同时飞行,但为了照顾普通群众的理解需求,暂时只考虑一把剑的情形。
所谓御剑术,实质上就是通过“气”来传递信息给已经通灵的剑,在这里,我们定义为瞬间给予剑一个设定好的速度。为了简化问题,将剑看作一个大小可以忽略的点,飞行在一个“二次元”——二维世界里,假设起点为原点(0,0)。需要注意的是,在这个世界中,剑依然会受到竖直向下的大小为g=9.8的重力加速度的影响。
现在由你来控制这个点,哦不,是剑,你已经掌握了N个命令,每个命令会瞬间清除剑的所有速度,然后给它一个固定的向量速度(V_xi, V_yi),分别表示水平速度与竖直速度,每个命令最多可发出一次。你的任务是,控制剑完成水平方向上长度为L的飞行,并使其完成飞行时的高度尽可能高,也就是,Y坐标值尽可能大。
由于你对“气”掌握的并不够熟练,所以只能在整数时刻时发出命令,可以认为这里的所有速度与加速度都转化为标准值(比如,米和秒),你只能在T=0,1,… 这种时刻下达指令。你希望知道横向飞行距离固定时最高的飞行高度。
Input
输入第一行为T,表示有T组测试数据。
每组数据以两个整数N,L开始,含义与描述对应。接下来的N行中,每行有两个整数,V_xi与V_yi。
[Technical Specification]
1. 1 <= T <= 77
2. 1 <= N <= 100
3. 1 <= L <= 100
4. 1 <= V_xi <=100
5. -100 <= V_yi <= 100
Output
对每组数据,先输出为第几组数据,然后输出最高飞行高度,四舍五入到小数点后三位。
Sample Input
Sample Output
在众多武侠类游戏中,都可以看到主角衣袂飘飘地在一旁通过“气”操控剑在空中飞行来杀伤敌人的帅气场景。
“十年磨一剑,霜刃未曾试”,在刻苦练习了不知道多少个日夜之后,今天你也掌握了这一项高超的武艺。虽然你可以并行地控制多柄剑同时飞行,但为了照顾普通群众的理解需求,暂时只考虑一把剑的情形。
所谓御剑术,实质上就是通过“气”来传递信息给已经通灵的剑,在这里,我们定义为瞬间给予剑一个设定好的速度。为了简化问题,将剑看作一个大小可以忽略的点,飞行在一个“二次元”——二维世界里,假设起点为原点(0,0)。需要注意的是,在这个世界中,剑依然会受到竖直向下的大小为g=9.8的重力加速度的影响。
现在由你来控制这个点,哦不,是剑,你已经掌握了N个命令,每个命令会瞬间清除剑的所有速度,然后给它一个固定的向量速度(V_xi, V_yi),分别表示水平速度与竖直速度,每个命令最多可发出一次。你的任务是,控制剑完成水平方向上长度为L的飞行,并使其完成飞行时的高度尽可能高,也就是,Y坐标值尽可能大。
由于你对“气”掌握的并不够熟练,所以只能在整数时刻时发出命令,可以认为这里的所有速度与加速度都转化为标准值(比如,米和秒),你只能在T=0,1,… 这种时刻下达指令。你希望知道横向飞行距离固定时最高的飞行高度。
Input
输入第一行为T,表示有T组测试数据。
每组数据以两个整数N,L开始,含义与描述对应。接下来的N行中,每行有两个整数,V_xi与V_yi。
[Technical Specification]
1. 1 <= T <= 77
2. 1 <= N <= 100
3. 1 <= L <= 100
4. 1 <= V_xi <=100
5. -100 <= V_yi <= 100
Output
对每组数据,先输出为第几组数据,然后输出最高飞行高度,四舍五入到小数点后三位。
Sample Input
3 1 1 10 10 2 10 10 10 10 20 3 30 10 10 10 15 10 20
Sample Output
Case 1: 0.951 Case 2: 15.100 Case 3: 30.500 Hint 如果御剑熟练一些,不需要在整数点发出命令,样例2的结果可以更大。但是这里,只能选择在T=0时发出命令(10,20),然后等待飞行完成。 注意,测试数据大部分都是纯随机生成的。
//Must so #include<iostream> #include<algorithm> #include<string> #include<cstring> #include<ctype.h> #include<queue> #include<vector> #include<set> #include<cstdio> #include<cmath> #define mem(a,x) memset(a,x,sizeof(a)) #define inf 1<<30 #define NN 105 using namespace std; const double PI = acos(-1.0); typedef long long LL; /********************************************************************************************************************** 1.除了最后一个命令,其他命令的执行时间必然是整秒,所以枚举每个命令作为最后一个命令的情况 2.剩下n-1条命令抽象成完全背包 3.n个命令抽象成n个物品,l表示背包体积,vxi表示第i件物品的体积,vyi表示物品的价值,运行时间表示物品数量 4.完全背包怎么玩来着?。。。 **********************************************************************************************************************/ struct Node { int x,y; }v[NN]; double dp[NN]; int N,V; double g = -9.8;//好怀恋的重力加速度=。= double fun(int o) { for (int i = 0;i < NN;i++) dp[i] = -inf; dp[0] = 0; for (int i = 0;i < N;i++) { if (o == i)//保留最后一条命令 continue; for (int j = V;j >= 0;j--) { for (int t = 0;t <= j/v[i].x;t++)//除了最后一条命令,其他命令执行时间都是整的 { if (v[i].x*t > j)//飞过头了 continue; dp[j] = max (dp[j],dp[j - v[i].x*t] + v[i].y*t + 0.5*g*t*t );//h = vt+(1/2)gt^2 } } } double ans = - inf; for (int i = 0;i <= V;i++)//最后一条命令的处理 { if (dp[i] == -inf) continue; double t = (V-i)*1.0/v[o].x; ans = max(ans,dp[i] + v[o].y*t + 0.5*g*t*t);//已经到达的高度 加上最后一条指令能到达的高度 } return ans; } int main() { int cas = 0; int T; cin>>T; while (T--) { scanf("%d%d",&N,&V); for (int i = 0;i < N;i++) scanf("%d%d",&v[i].x,&v[i].y); double ans = - inf; for (int i = 0;i < N;i++) ans = max(ans,fun(i)); printf("Case %d: %.3lf\n",++cas,ans); } return 0; }
相关文章推荐
- HDU 4501 小明系列之买年货(三维背包)
- 【NYOJ】[811]变态最大值
- 1. Two Sum
- 【慕课笔记】U4 多态 第2节 多态中的引用类型转换
- 在PC端实现HTML5-geolocation的一些细节
- 选择
- GSON
- bzoj3398: [Usaco2009 Feb]Bullcow 牡牛和牝牛
- VS2010 Error : Unable to start program Access is denied
- Notes of Python Learning 2/10/2016
- NSGAIII中的Niche preservation操作
- 上传图片或文件到服务器端
- NSGAIII中的Associate
- keepalive (2)
- oracle soft 11.2.0.4 for any OS
- Redis入门很简单之八【Spring Data Redis初探】
- 朴素贝叶斯分类器
- [LeetCode] Two Sum II - Input array is sorted 两数之和之二 - 输入数组有序
- HDU 3591 (多重背包)
- Redis入门很简单之七【使用Jedis实现客户端Sharding】