【hdu 3177 Crixalis's Equipment】 题解
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3177
\(describe\):
有一个山洞,山洞的容积最大为\(v\)。现在你有\(n\)个物品,这些物品在往山洞里搬和放在山洞所需要占用山洞的体积是两个不同的值\(B\),\(A\)。你可以理解为在搬运这个物品进洞时需要的容积为一个\(B\),放下物品后的容积是一个\(A\)。在任何时刻搬运物品都不允许超过山洞的最大容积。试求能不能把所有物品搬进去
题解:
这个题正解是贪心...没错...
题目只问的是能不能都放完,我们贪心地往里放物品看看能不能放完就好了。
证明:
~~zhx的证明法: ~~
——贪心题都是排序题。
设只有两个物品a,b
要么先放a,要么先放b,反正两种放法
考虑若先放a的话 当前v要 > a.B 放了a.A
然后放b 放了b.B 结果 a.A+b.B
复读:
考虑若先放b的话 当前v要 > b.B 放了b.A
然后放a 放了a.B 结果 b.A+a.B
比较两个结果取min就ok了啊
操作?
如果排序a,b
放的顺序是a,b
那么就会是a.A+b.B < b.A+a.B
你把这俩反着证明也一样,自己明白咋排序就行,实在不行排上几种序什么a.A+a.B<b.A+b.B a.A-a.B<b.A-b.B......取个min
看心情化简:a.A-a.B < b.A-b.B
code:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 1e7;
int n, v, ans, T;
struct thing{
int B, A;
}e[maxn];
bool cmp(thing a, thing b)
{
return a.A + b.B < b.A + a.B;
}
int main()
{
ios::sync_with_stdio(false);
cin>>T;
while(T--)
{
ans = 0;
cin>>v>>n;
for(int i = 1; i <= n; i++)
cin>>e[i].A>>e[i].B;
sort(e+1, e+1+n, cmp);
for(int i = 1; i <= n; i++)
if(e[i].B <= v)
{
ans++;
v -= e[i].A;
}
if(ans == n) cout<<"Yes\n";
else cout<<"No\n";
}
return 0;
}
考虑变式一下:
如果是求最多能放多少物品呢?
那就是DP了。
如果能放完的话,第一个是一定会放进去的,所以用贪心判断能不能放完是可以的,但是如果求最多放进去数量的话,我们第一个选不选是不确定的,所以需要跑一个01背包。
但是..DP?需要无后效性的。
那么最优的序列,就是我们贪心排序过后的序列。
好了,在这个序列上跑一个背包。
但是我们在进行状态转移的时候,需要控制一下。
设\(dp[j]\) 表示已经放满\(j\)容积时的能放下的最多的物品数
那么转移方程就是\(dp[j] = max(dp[j], dp[j-a[i].A]+1)\)
转移要满足一开始能搬进这个东西来,所以又有:
\(if(v - (j - a[i].A) >= a[i].B)\)
j是当前使用的容积(包含着搬进后的物品容积,所以j-a[i].A),再用v减去,就是剩下的。
于是:
code:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 1000;
int dp[maxn], n, v, ans;
struct thing{
int A, B;
}a[maxn];
bool cmp(thing a, thing b)
{
return a.A - a.B < b.A - b.B;
}
int main()
{
cin>>n>>v;
for(int i = 1; i <= n; i++) cin>>a[i].B>>a[i].A;
sort(a+1, a+1+n, cmp);
for(int i = 1; i <= n; i++)
{
for(int j = v; j >= a[i].A; j--)
{
if(v - (j - a[i].A) >= a[i].B)
dp[j] = max(dp[j-a[i].A] + 1, dp[j]);
ans = max(dp[j], ans);
}
}
cout<<ans;
return 0;
}
//MisakaAzusa
//dsbdsb
【hdu 3177 Crixalis's Equipment】 题解的更多相关文章
- Hdu 3177 Crixalis's Equipment
Crixalis's Equipment Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Oth ...
- HDU 3177 Crixalis's Equipment (贪心,差值)
题意:判断 n 件物品是否可以搬进洞里,每件物品有实际体积A和移动时的额外体积 B . 析:第一反应就是贪心,一想是不是按B从大到小,然后一想,不对,比如体积是20,第一个 是A=11, B=19.第 ...
- HDU ACM 3177 Crixalis's Equipment
Crixalis's Equipment Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Oth ...
- hdu 3177 Crixalis's Equipment
Crixalis's Equipment Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Oth ...
- HDU 3177 Crixalis's Equipment(贪婪)
主题链接:http://acm.hdu.edu.cn/showproblem.php? pid=3177 Problem Description Crixalis - Sand King used t ...
- 杭电 3177 Crixalis's Equipment
http://acm.hdu.edu.cn/showproblem.php? pid=3177 Crixalis's Equipment Time Limit: 2000/1000 MS (Java/ ...
- HDOJ 3177 Crixalis's Equipment
Crixalis's Equipment Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Oth ...
- hdu---3177 Crixalis's Equipment 根据 两个元素 之间的权衡进行排序
Crixalis's Equipment Problem Description Crixalis - Sand King used to be a giant scorpion(蝎子) in the ...
- HDU 2157 How many ways?? 题解
题目 春天到了, HDU校园里开满了花, 姹紫嫣红, 非常美丽. 葱头是个爱花的人, 看着校花校草竞相开放, 漫步校园, 心情也变得舒畅. 为了多看看这迷人的校园, 葱头决定, 每次上课都走不同的路线 ...
随机推荐
- fuzhou 1683 纪念SlingShot ***
Problem 1683 纪念SlingShot Accept: 361 Submit: 1287Time Limit: 1000 mSec Memory Limit : 32768 KB ...
- Java - “JUC”原子类
根据修改的数据类型,可以将JUC包中的原子操作类可以分为4类. 1. 基本类型: AtomicInteger, AtomicLong, AtomicBoolean ;2. 数组类型: AtomicIn ...
- UVA 455(最小周期)
最小周期可以用%枚举 #include <iostream> #include <string> #include <cstring> #include <c ...
- docker启动容器报错:IPv4 forwarding is disabled. Networking will not work
报这个错误会导致宿主机以外的pc 访问不了容器 按照网上的解决办法: 在/usr/lib/sysctl.d/00-system.conf文件后加net.ipv4.ip_forward=1 即可 然后重 ...
- Web前端面试指导(十六):为什么要初始化CSS样式?
题目点评 这个题目乍一看感觉怪怪的,什么叫初始化样式了?如果换一句话你可能就理解了,就是通用样式.这道题目主要涉及的是理论方面的知识,不用写代码,只要描述清楚就可以了 初始化样式的原因 因为浏览器的兼 ...
- axios中设置post请求,后台却无法识别参数
场景:在使用iview时,定义api请求时,代码如下 export const delWord = (data) => { return axios.request({ url: '/words ...
- Android 自定义简易的方向盘操作控件
最近在做一款交互性较为复杂的APP,需要开发一个方向操作控件.最终用自定义控件做了一个简单的版本. 这里我准备了两张素材图,作为方向盘被点击和没被点击的背景图.下面看看自定义的Wheel类 publi ...
- ZABBIX 2.1.0 发布,分布式系统监控
ZABBIX 2.1.0 发布了,这相当是 ZABBIX 2.2 的首个 Alpha 版本,包括了新的主要的功能和改进. 主要包括如下几个方面的提升: 性能提升 可加载模块 移除对未知事件的支持 应用 ...
- jekyll开发静态网站
一.Ruby环境安装配置 首先下载ruby安装ruby download ,安装完ruby后,再安装rubyGems:运行gem update --system即可. 然后下载DevKit-mingw ...
- 常规操作系统Windows系统淋雨系统Unix系统netware等系统介绍分析
服务器操作系统有有很多,比如说:Windows.Linux.Unix和Netware......但我们经常用过仅有Windows和Linux.下面简单为大家介绍一下常见服务器操作系统. 1.Windo ...