ZOJ 3931 Exact Compression
题目看了半小时才看懂的。
题意:首先根据给出的序列,构造出哈夫曼树,构造出来的是一棵二叉树,每个节点都有一个权值,每个节点的两个儿子只能取一个,问能否使取出来的节点权值之和刚好等于e。
这样一分析就很容易看出是01背包。但是,背包容量特别大!不能纯粹的用循环做背包肯定会超时。可以使用两个队列存能够凑出来的数字(相当于滚动数组的作用),还有一个优化,看当前要压入队列的数字是否已经在队列中,这个可以用map存一下。
#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
#include<map>
#include<algorithm>
using namespace std; const int maxn=;
int s;
long long e;
long long f[maxn];
struct X
{
long long a,b;
} u[maxn];
int Size,cnt;
map<long long,bool>flag; struct cmp
{
bool operator ()(long long &a,long long &b)
{
return a>b;
}
}; int main()
{
int T; scanf("%d",&T);
while(T--)
{
flag.clear();
scanf("%d",&s);
cnt=;
priority_queue<long long,vector<long long>,cmp>q;
for(int i=; i<=s; i++)
{
scanf("%lld",&f[i]);
q.push(f[i]);
}
scanf("%lld",&e);
Size=s;
while(Size!=)
{
u[cnt].a=q.top();
q.pop();
Size--;
u[cnt].b=q.top();
q.pop();
Size--;
q.push(u[cnt].a+u[cnt].b);
cnt++;
Size++;
} queue<long long>Q1;
queue<long long>Q2;
int f=;
Q1.push(u[].a);
Q1.push(u[].b); for(int i=; i<cnt; i++)
{
flag.clear();
if(f==)
{
while(!Q1.empty())
{
if(Q1.front()+u[i].a<=e&&flag[Q1.front()+u[i].a]==){
Q2.push(Q1.front()+u[i].a);
flag[Q1.front()+u[i].a]=;
}
if(Q1.front()+u[i].b<=e&&flag[Q1.front()+u[i].b]==){
Q2.push(Q1.front()+u[i].b);
flag[Q1.front()+u[i].b]=;
}
Q1.pop();
}
f=;
}
else
{
while(!Q2.empty())
{
if(Q2.front()+u[i].a<=e&&flag[Q2.front()+u[i].a]==){
Q1.push(Q2.front()+u[i].a);
flag[Q2.front()+u[i].a]=;
}
if(Q2.front()+u[i].b<=e&&flag[Q2.front()+u[i].b]==){
flag[Q2.front()+u[i].b]=;
Q1.push(Q2.front()+u[i].b);
}
Q2.pop();
}
f=;
}
} bool ans=; if(f==)
{
while(!Q1.empty())
{
if(Q1.front()==e) ans=;
Q1.pop();
}
}
else
{
while(!Q2.empty())
{
if(Q2.front()==e) ans=;
Q2.pop();
}
} if(ans) printf("Yes\n");
else printf("No\n");
}
return ;
}
ZOJ 3931 Exact Compression的更多相关文章
- 01背包 ZOJ 3931 Exact Compression
题目连接 题意:n个数字构建哈夫曼树,问是否存在这样一棵树使得:(Fi数字大小,Ci哈夫曼表示下,'0'的数量) 分析:每次从优先队列取出两个数字可以互换位置,这样可以01互换.设a[i] <= ...
- Types of compression algorithms
http://www.html5rocks.com/en/tutorials/speed/img-compression/ Types of compression algorithms There ...
- hdu 4424 & zoj 3659 Conquer a New Region (并查集 + 贪心)
Conquer a New Region Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- ZOJ 2477 Magic Cube(魔方)
ZOJ 2477 Magic Cube(魔方) Time Limit: 2 Seconds Memory Limit: 65536 KB This is a very popular gam ...
- zoj 2081 BFS 延迟标记 读入问题
Mission Impossible Time Limit: 2 Seconds Memory Limit: 65536 KB ...
- ZOJ 3349 Special Subsequence
Special Subsequence Time Limit: 5000ms Memory Limit: 32768KB This problem will be judged on ZJU. Ori ...
- Dancing Links and Exact Cover
1. Exact Cover Problem DLX是用来解决精确覆盖问题行之有效的算法. 在讲解DLX之前,我们先了解一下什么是精确覆盖问题(Exact Cover Problem)? 1.1 Po ...
- ZOJ People Counting
第十三届浙江省大学生程序设计竞赛 I 题, 一道模拟题. ZOJ 3944http://www.icpc.moe/onlinejudge/showProblem.do?problemCode=394 ...
- BZOJ 3931: [CQOI2015]网络吞吐量
3931: [CQOI2015]网络吞吐量 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1555 Solved: 637[Submit][Stat ...
随机推荐
- WPF 常用样式
TextBox <Window x:Class="WpfDemo.ListBoxTemaple" xmlns="http://schemas.microsoft.c ...
- Android &Swift iOS开发:语言与框架对比
转载自:http://www.infoq.com/cn/articles/from-android-to-swift-ios?utm_campaign=rightbar_v2&utm_sour ...
- java断点
第一步: 用firefox运行程序,当点击保存,提示保存失败后,启动firebug 通过请求找到addNew.ezt出现错误,在eztnews.xml里通过ctrl+F查找找到请求执行的类和方法 找到 ...
- js框架——angular.js
这是一个前端用的框架,使用简单.详细介绍这里就不写了,主要介绍其语法和作用—— 1. 声明一个angular 如果想要使用一个angular代码,则需要在[想要使用angular的范围内写上ng-ap ...
- L7,too late
words: parcel,包裹 detective,侦探 expect,期待 airfield,飞机起落的场地 guard,警戒,守卫,n precious,adj,珍贵的 stone,石头 exp ...
- Effective C++笔记之Item49【了解new-handler的行为】
//---------------------------------------------------------// //------------------------------------ ...
- struts2整合spring应用实例
我们知道struts1与spring整合是靠org.springframework.web.struts.DelegatingActionProxy来实现的,以下通过具体一个用户登录实现来说明stru ...
- we7 数据库
备份其他we7网站数据库 然后附加数据库,重新命名即可 不能是对其他we7数据库生成脚本,然后执行脚本,因为后台需要一些配置数据 不然后台看不到左侧的工具栏
- (转)初识suse——linux
Linux这种系统很奇怪,差不多每种不同的版本,它所使用的安装等一些重要命令皆有所变化.假若,你要熟练掌握一种OS,那么如果安装软件/应用,那是入门的第一步. 安装命令中: RedHat.Cent ...
- 【2013 ICCV】Abnormal Event Detection at 150 FPS in MATLAB
2. method 把每一帧变成不同尺度,并且把每一层分成互不覆盖的patch.连续的5帧堆叠在一起形成时空立方体.对时空立方体计算3D梯度特征[11].这些视屏序列中的特征,根据空间位置的相关性,进 ...