UVA - 12325 Zombie's Treasure Chest (分类搜索)
题目:
有一个体积为N的箱子和两种数量无限的宝物。宝物1的体积为S1,价值为V1;宝物2的体积为S2,价值为V2.输入均为32位带符号整数。计算最多能装多大价值的宝物,每种宝物都必须拿非负整数个。
思路:
看完紫书的分析,不知道怎么判断N/S1、N/S2到底在那个范围内较大、较小,于是就用了下面的方法,不过这个方法效率低的很
S1个宝物2的体积=S2个宝物1的体积,他们的价值就是S1*V2和S2*V1.
1.如果S1*V2 > S2*V1,那么宝物1最多拿S2-1个,因为一旦满了S2个宝物1,这些就可以转换成S1个宝物2。然后枚举宝物1就可以了,注意这里范围是min{S2-1,N/S1}。
2.如果S1*V2 < S2*V1,那么宝物2最多拿S1-1个,因为一旦满了S1个宝物2,这些就可以转换成S2个宝物1。然后枚举宝物2就可以了,注意这里范围是min{S1-1,N/S2}。
3.如果S1*V2 = S2*V1,那么如果V1 > V2,就尽量多拿宝物1,相反就尽量多拿宝物2。
然后写代码就ok了。
代码:
#include <bits/stdc++.h>
#define inf 0x3f3f3f3f
#define MAX 1000000009
#define FRE() freopen("in.txt","r",stdin)
#define FRO() freopen("out.txt","w",stdout)
using namespace std;
typedef long long ll;
const int maxn = ;
ll n,s1,v1,s2,v2; int main(){
//FRE();
ios::sync_with_stdio(false);
int T,kase=;
cin>>T;
while(T--){
cin>>n>>s1>>v1>>s2>>v2;
ll a = s1*v2, b= s2*v1;
ll ans = ;
if(a>b){//对应上述情况1
for(ll i=; i<min(s2,n/s1+); i++){
ll num = (n-i*s1)/s2;
ans = max(ans,i*v1+num*v2);
}
}else if(a<b){//对应上述情况2
for(ll i=; i<min(s1,n/s2+); i++){
ll num = (n-i*s2)/s1;
ans = max(ans,i*v2+num*v1);
}
}else{//情况3中按各个宝物价格大小决定枚举那个宝物
if(v1>v2){
ll i=;
for(; i<(n/s1); i++){
ll num = (n-i*s1)/s2;
ans = max(ans, i*v1+num*v2);
}
}else {
ll i=;
for(; i<(n/s2); i++){
ll num = (n-i*s2)/s1;
ans = max(ans, i*v2+num*v1);
}
}
}
cout<<"Case #"<<++kase<<": "<<ans<<endl;
}
return ;
}
AC之后在VJ中发现了一个判断较大较小的方法做的,于是我又改了改自己写的代码,发现当这个界限设在1e3~1e4的时候,搜索的效率会达到最大。
当(N/S1)较小的时候,就枚举宝物1,尽量多拿宝物2,当(N/S2)较小的时候,就枚举宝物2,尽量多拿宝物1,如果两者都较小的时候,就按上边的1、2两个情况进行分析。
代码:
#include <bits/stdc++.h>
#define inf 0x3f3f3f3f
#define MAX 1e3
#define FRE() freopen("in.txt","r",stdin)
#define FRO() freopen("out.txt","w",stdout)
using namespace std;
typedef long long ll;
const int maxn = ;
ll n, s1, v1, s2, v2; int main() {
//FRE();
ios::sync_with_stdio(false);
int T, kase = ;
cin >> T;
while(T--) {
cin >> n >> s1 >> v1 >> s2 >> v2;
ll c = n / s1, d = n / s2;
ll a = s1 * v2, b = s2 * v1;
ll ans = ;
if(c < MAX) {
for(ll i = ; i < (n / s1 + ); i++) {
ll num = (n - i * s1) / s2;
ans = max(ans, i * v1 + num * v2);
}
} else if(d < MAX) {
for(ll i = ; i < (n / s2 + ); i++) {
ll num = (n - i * s2) / s1;
ans = max(ans, i * v2 + num * v1);
}
} else if(a > b) {
for(ll i = ; i < min(s2, n / s1 + ); i++) {
ll num = (n - i * s1) / s2;
ans = max(ans, i * v1 + num * v2);
}
} else if(a <= b) {
for(ll i = ; i < min(s1, n / s2 + ); i++) {
ll num = (n - i * s2) / s1;
ans = max(ans, i * v2 + num * v1);
}
}
cout << "Case #" << ++kase << ": " << ans << endl;
}
return ;
}
UVA - 12325 Zombie's Treasure Chest (分类搜索)的更多相关文章
- UVa 12325 - Zombie's Treasure Chest-[分类枚举]
12325 Zombie’s Treasure Chest Some brave warriors come to a lost village. They are very lucky and fi ...
- Uva 12325 Zombie's Treasure Chest (贪心,分类讨论)
题意: 你有一个体积为N的箱子和两种数量无限的宝物.宝物1的体积为S1,价值为V1:宝物2的体积为S2,价值为V2.输入均为32位带符号的整数.你的任务是最多能装多少价值的宝物? 分析: 分类枚举, ...
- UVa 12325 Zombie's Treasure Chest【暴力】
题意:和上次的cf的ZeptoLab的C一样,是紫书的例题7-11 不过在uva上交的时候,用%I64d交的话是wa,直接cout就好了 #include<iostream> #inclu ...
- uva 12325 Zombie's Treasure Chest
https://vjudge.net/problem/UVA-12325 题意: 一个箱子,体积为N 两种宝物,体积为S1.S2,价值为V1.V2,数量无限 最多装多少价值的宝物 数据范围:2^32 ...
- UVA 12325 Zombie'sTreasureChest 宝箱 (分类枚举)
看上去非常像背包的问题,但是体积太大了. 线性规划的知识,枚举附近点就行了,优先选性价比高的, 宝物有两种体积为S0,价值V0,体积S1,价值V1. 枚举分以下几种: 1:枚举拿宝物1的数量,然后尽量 ...
- G - Zombie’s Treasure Chest(动态规划专项)
G - Zombie’s Treasure Chest Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d &am ...
- 一道看似dp实则暴力的题 Zombie's Treasure Chest
Zombie's Treasure Chest 本题题意:有一个给定容量的大箱子,此箱子只能装蓝宝石和绿宝石,假设蓝绿宝石的数量无限,给定蓝绿宝石的大小和价值,要求是获得最大的价值 题解:本题看似是 ...
- HDU 4091 Zombie’s Treasure Chest 分析 难度:1
Zombie’s Treasure Chest Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/ ...
- 【例题 7-11 UVA - 12325】Zombie's Treasure Chest
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 1.N/s1 < 1e6 枚举1的个数 2.N/s2<1e6 枚举2的个数 3.s1和s2的值较小 假设买了s2个1和s ...
随机推荐
- NaN in JavaScript
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/NaN The global NaN ...
- bzoj2989
坐标轴转化+cdq分治 我们发现那个绝对值不太好搞,于是我们把曼哈顿距离转为切比雪夫距离,x'=x-y,y'=x+y,这样两点之间距离就是max(|x1'-x2'|,|y1'-y2'|),这个距离要小 ...
- 8. Ext文本输入框:Ext.form.TextField属性汇总
转自:https://blog.csdn.net/ryuudenne/article/details/8834650 Ext.form.TextField主要配置表: allowBlank ...
- 词典(一) 跳转表(Skip table)
词典,顾名思义,就是通过关键码来查询的结构.二叉搜索树也可以作为词典,不过各种BST,如AVL树.B-树.红黑树.伸展树,结构和操作比较复杂,而且理论上插入和删除都需要O(logn)的复杂度. 在词典 ...
- P2339 提交作业usaco(区间dp)
P2339 提交作业usaco 题目背景 usaco 题目描述 贝西在哞哞大学选修了 C 门课,她要把所有作业分别交给每门课的老师,然后去车站和同学们一起回家.每个老师在各自的办公室里,办公室要等他们 ...
- 10.13NOIP模拟题
/* 容斥原理 考虑到a[i]要么不会太大,要么就对答案贡献很小 dfs即可 */ #include<bits/stdc++.h> #define ll long long #define ...
- CentOS 6.5克隆后eth1与eth0的问题
CentOS 6.5克隆后eth1与eth0的问题 按照安装文档执行以下步骤时: 从克隆出来的虚拟机网卡都会被命名为eth1,而有些程序或者脚本,涉及到网卡的,默认写的是eth0,这时就存在要 ...
- JavaScript--编程练习2
制作一个跳转提示页面: 要求: 1. 如果打开该页面后,如果不做任何操作则5秒后自动跳转到一个新的地址,如慕课网主页. 2. 如果点击“返回”按钮则返回前一个页面. 效果: 注意: 在窗口中运行该程序 ...
- exe4j将可执行的jar封装成exe文件
1,将java项目打包成可执行的jar:https://www.cnblogs.com/3b2414/p/9355292.html, 2,下载好exe4j工具, 3,首先注册,如果你不注册,打包好的软 ...
- opencv边缘滤波
2018-03-0422:16:11 import cv2 as cv import numpy as np def bi_demo (image): print ("ceshi" ...