Description

如果你有足够的石块,那么建一座金字塔绝不算难事。举个例子,在一块平地上,我们铺一个10*10的矩形,然后在10*10的矩形上面铺一个9*9的,然后8*8的……以此类推,直到顶上1*1。这个金字塔有10层,我们称这类金字塔为“高金字塔”。
如果你认为这样的金字塔太陡了,那么我们有办法让他看上去坡度平缓一些。比如,在10*10的矩形上,我们铺一个8*8的矩形,然后是6*6的……这样的金字塔只有5层了,大约为底座边长的一半。我们称之为“矮金字塔”。
很久以前,一位法老从父亲那儿继承了一大堆用于搭建金字塔的石块。他决定用这些石块搭建一座金字塔——每个石块都必须用上。建筑师告诉他,这样的要求不一定能实现。例如,如果你有10块石头,那么可以搭一个底座为3的矮金字塔;如果有5块石头,那么就搭一个底座为2的高金字塔。如果你有7块石头呢?不幸的是,确实找不出一种搭金字塔的方案了。
思考再三后,法老决定放低要求——搭不止一座金字塔。但是仍然要满足如下几个条件:
1.所有石块都必须用上;
2.金字塔数要尽可能少;
3.所有金字塔两两不同;
4.金字塔至少包含两层,即底座为1的金字塔和底座为2的矮金字塔是不允许的;
5.满足以上4点的基础上,最大的金字塔要尽可能大(大定义为用的石块数多);
6.满足以上5点的基础上,次大的金字塔要尽可能大;
7.以此类推。。
你能求出最好的搭金字塔方案么?或者告诉法老这是做不到的。
金字塔只有300多种,先做一次bitset优化的0-1背包(保证条件1.3.4.),然后对每个询问搜索出条件2.的最优解(处理出哪些n可以用1到3个拼出,其余则只能>=4,用于最优性剪枝),通过搜索顺序保证条件5.6.7.
#include<cstdio>
#include<algorithm>
#include<bitset>
int s1[],s2[];
struct item{
int v,a,t;
bool operator<(item x)const{return v!=x.v?v<x.v:t<x.t;}
}is[],ps[],ps1[];
std::bitset<>f[];
int ip=,pp,mf[];
void dfs(int n,int w,int t){
if(t+mf[n]>=pp)return;
if(!n){
pp=t;
for(int i=;i<t;++i)ps[i]=ps1[i];
}
if(!w)return;
if(n>=is[w].v&&f[w-].test(n-is[w].v))ps1[t]=is[w],dfs(n-is[w].v,w-,t+);
dfs(n,w-,t);
}
int main(){
s1[]=s2[]=;
for(int i=;i<=;++i){
s1[i]=s1[i-]+i*i;
s2[i]=s2[i-]+i*i;
}
for(int i=;s1[i]<=;++i)is[++ip]=(item){s1[i],i,};
for(int i=;s2[i]<=;++i)is[++ip]=(item){s2[i],i,};
std::sort(is+,is+ip+);
f[].set();
for(int i=;i<=ip;++i)f[i]=f[i-]|f[i-]<<is[i].v;
for(int i=;i<=ip;++i){
int x=is[i].v;
if(!mf[x])mf[x]=;
}
for(int i=;i<=ip;++i){
for(int j=i+;j<=ip;++j){
int x=is[i].v+is[j].v;
if(x<=&&!mf[x])mf[x]=;
}
}
for(int i=;i<=ip;++i){
for(int j=i+;j<=ip;++j){
for(int k=j+;k<=ip;++k){
int x=is[i].v+is[j].v+is[k].v;
if(x<=&&!mf[x])mf[x]=;
}
}
}
for(int i=;i<=;++i)if(!mf[i])mf[i]=;
for(int _t=,n;;++_t){
if(scanf("%d",&n)!=||!n)return ;
if(!f[ip].test(n))printf("Case %d: impossible\n",_t);
else{
printf("Case %d:",_t);
pp=;
dfs(n,ip,);
for(int i=;i<pp;++i)printf(" %d%c",ps[i].a,"LH"[ps[i].t]);
puts("");
}
}
}

bzoj 3965: [WF2011]Pyramids的更多相关文章

  1. HDU 3824/ BZOJ 3963 [WF2011]MachineWorks (斜率优化DP+CDQ分治维护凸包)

    题面 BZOJ传送门(中文题面但是权限题) HDU传送门(英文题面) 分析 定义f[i]f[i]f[i]表示在iii时间(离散化之后)卖出手上的机器的最大收益.转移方程式比较好写f[i]=max{f[ ...

  2. BZOJ 3963: [WF2011]MachineWorks [CDQ分治 斜率优化DP]

    传送门 当然了WF的题uva hdu上也有 你的公司获得了一个厂房N天的使用权和一笔启动资金,你打算在这N天里租借机器进行生产来获得收益.可以租借的机器有M台.每台机器有四个参数D,P,R,G.你可以 ...

  3. ●BZOJ 3963 [WF2011]MachineWorks

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3963 题解: 斜率优化DP,CDQ分治. 先按时间排序.(规定以下内容的第i台机器的卖出时间 ...

  4. bzoj 3961: [WF2011]Chips Challenge【最小费用最大流】

    参考:https://blog.csdn.net/Quack_quack/article/details/50554032 神建图系列 首先把问题转为全填上,最少扣下来几个能符合条件 先考虑第2个条件 ...

  5. BZOJ 3963: [WF2011]MachineWorks 斜率优化 + splay动态维护凸包

    Description 你是任意性复杂机器公司(Arbitrarily Complex Machines, ACM)的经理,公司使用更加先进的机械设备生产先进的机器.原来的那一台生产机器已经坏了,所以 ...

  6. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  7. 【BZOJ 3958】 3958: [WF2011]Mummy Madness (二分+扫描线、线段树)

    3958: [WF2011]Mummy Madness Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 96  Solved: 41 Descripti ...

  8. 【BZOJ 2673】[Wf2011]Chips Challenge

    题目大意: 传送门 $n*n$的棋盘,有一些位置可以放棋子,有一些已经放了棋子,有一些什么都没有,也不能放,要求放置以后满足:第i行和第i列的棋子数相同,同时每行的棋子数占总数比例小于$\frac{A ...

  9. BZOJ 3963 HDU3842 [WF2011]MachineWorks cdq分治 斜率优化 dp

    http://acm.hdu.edu.cn/showproblem.php?pid=3842 写的check函数里写的<但是应该是<=,调了一下午,我是个zz. 就是普通的斜率优化因为有两 ...

随机推荐

  1. JS判断输入值为正整数

    JS中的test是原来是JS中检测字符串中是否存在的一种模式,JS输入值是否为判断正整数代码: <script type=”text/javascript”> function test( ...

  2. nohup 不生成 nohup.out的方法

    nohup java -jar /xxx/xxx/xxx.jar >/dev/>& & 关键在于最后的 >/dev/>& 部分,/dev/null是一个 ...

  3. 过滤器系列(一)—— Bloom filter

    因为要做过滤器相关内容,最近读了一些过滤器方面的文章,准备从中提取主要思想写几篇博客. 作为这系列的第一篇文章,首先得讲一下过滤器是干什么用的.从历史发展来看,过滤器最早出现是作为散列表的替代品,那么 ...

  4. IIR滤波器设计(调用MATLAB IIR函数来实现)

    转载请注明文章来源 – http://blog.csdn.net/v_hyx ,请勿用于任何商业用途         对于滤波器设计,以前虽然学过相关的理论(现代数字信号处理和DSP设计),但一直不求 ...

  5. IE9(8)跨域(CORS)解决方案

    HTML5中 XMLHttpRequest Level 2 的推出.可以通过在返回的HTTP请求头中加入 Access-Control-Allow-Origin 的设置,让浏览器支持对不同域的AJAX ...

  6. springboot整合mybatis增删改查(四):完善增删改查及整合swgger2

    接下来就是完成增删改查的功能了,首先在config包下配置Druid数据连接池,在配置之前先把相关配置在application.preperties中完善 application.preperties ...

  7. RabbitMQ核心概念

    AMQP的四个主要概念 1.虚拟主机(virtual host)或(vhost) 2.交换机(exchange) 3.队列(queue) 4.绑定器(bind) 什么是虚拟主机? 一组交换机.队列和绑 ...

  8. Struts2自定义标签2自定义一个按班级id查询出该班级下的学生,存放进值栈,并遍历出来。

    Struts2自定义标签的流程概念: (1)需要两个类:标签类(继承相应的tag类),基本类(继承Component).标签类专门负责从客户端取得用户输入的一些属性,这个普通的jsp自定义标签一样,取 ...

  9. vue+webpack多个项目共用组件动态打包单个项目

    原文复制:https://www.jianshu.com/p/fa19a07b1496 修改了一些东西,因为sh脚本不能再window电脑执行,所以改成了node脚本.这是基于vue-cli2.0配置 ...

  10. WPF 设置TextBox为空时,背景为文字提示

    WPF 设置TextBox为空时,背景为文字提示.   <TextBox FontSize="17" Height="26" Margin="2 ...