2020 ICPC·小米邀请赛 决赛 J. Rikka with Book(状压dp)

news2024/9/20 16:42:31

题目

登录—专业IT笔试面试备考平台_牛客网

n(n<=20)本书,放在桌子上,

第i本书的可以看成是li(li<=1e3)*1*1的物体,其中长为li,宽为1,高为1,

质量均匀分布,且为wi(wi<=1e3)

求n本书摞在一起,使得任意一本书都不掉下桌子时,书能伸出桌沿的长度的最大值是多少

思路来源

官方题解&申老师

题解

放的话肯定是从上往下放,这样已经放上去的可以看成是一个物体,

并且当b物品摞在a物品之上时,一定是把b物品的重心放到a物品的边沿上,

好比把a物品当成桌子,一定是放到桌沿上,

再将a和b看成同一个物品时,一定是放到下一个物品的边沿上,

一旦一个物体的质量和重心的位置确定了,这个物品的其他属性就无关紧要了,从而无后效性

所以状压每次往下垫的书是哪一本,确定放的顺序,关注的是伸出去的最大值

往下垫的书的重心位于l/2处,质量为a;

上面的书看成一体时,重心位于边沿,质量为b

那么新的重心,根据杠杆原理,位于距边沿a/(a+b)的位置,记add=a/(a+b)

记原来的伸出去的最大值为x,则新的最大值为x+add,

此外,可以旋转一下整个物体,使整个物体的重心仍落在边沿上不落下去,

但是伸出边沿的是往下垫的书的另外半边,也就是l-add这半边,二者取max即可

所以,如果最优解是第i本书伸的最远,最上面的书是1,最下面的书是n,

一定是对于j∈[1,i-1]来说,把[1,j]看成一体时,[1,j]的重心压在j+1的左边沿,

对于j∈[i+1,n]来说,将[1,j-1]看成一体时,[1,j-1]的重心压在j的右边沿

每次枚举的时候,旋转or不旋转二选一都试一下,显然可以覆盖这种情况

代码1

维护的是长度l、到左边沿的距离p、整体的质量w

// Problem: Rikka with Book
// Contest: NowCoder
// URL: https://ac.nowcoder.com/acm/contest/9328/J?&headNav=acm
// Memory Limit: 1048576 MB
// Time Limit: 2000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i=(a);i<=(b);++i)
#define per(i,a,b) for(int i=(a);i>=(b);--i)
typedef long long ll;
typedef double db;
typedef pair<ll,int> P;
#define fi first
#define se second
#define pb push_back
#define dbg(x) cerr<<(#x)<<":"<<x<<" ";
#define dbg2(x) cerr<<(#x)<<":"<<x<<endl;
#define SZ(a) (int)(a.size())
#define sci(a) scanf("%d",&(a))
#define scll(a) scanf("%lld",&(a))
#define pt(a) printf("%d",a);
#define pte(a) printf("%d\n",a)
#define ptlle(a) printf("%lld\n",a)
#define debug(...) fprintf(stderr, __VA_ARGS__)
const int N=20,M=(1<<20)+5;
int n;
db dp[M];
int lb(int x){
	return x&(-x);
}
struct node{
	db l,p;//长度 离左侧距离
	int w;//质量
	node(){l=0;p=1e7;w=0;}
	db dis(){
		return l-p;
	}
	void show(int i=-1){
		printf("i:%d l:%lf p:%lf w:%d\n",i,l,p,w);
	}
}e[M];
//b放在a上
bool operator>(node a,node b){
	return a.dis()>b.dis();
}
node mer(node a,node b){
	db x=a.l-a.p;
	node c;
	db B=a.w*x/(a.w+b.w);
	if(b.p>a.l){//b更左
		c.l=b.l;
		c.p=b.p-B;
		//b.l-b.p+B
	}
	else{//a更左
		c.l=a.l+b.l-b.p;
		c.p=a.l-B;
		//b.l-b.p+B
	}
	c.w=a.w+b.w;
	if(c.p>c.l-c.p)c.p=c.l-c.p;
	//puts("");
	//a.show();b.show();c.show();
	//puts("");
	return c;
}
void sol(){
	sci(n);
	rep(i,0,n-1){
		int x=1<<i;
		scanf("%lf",&e[x].l);
		e[x].p=e[x].l/2.0;
	}
	rep(i,0,n-1){
		int x=1<<i;
		scanf("%d",&e[x].w);
	}
	int up=(1<<n)-1;
	rep(i,1,up){
		if(lb(i)==i)continue;
		//printf("i:%d\n",i);
		rep(j,0,n-1){
			if(!(i>>j&1))continue;
			int v=1<<j,oth=i^v;
			node w=mer(e[v],e[oth]);//只枚举最底下那个是什么
			if(w>e[i])e[i]=w;
			//e[oth].p=e[oth].l-e[oth].p;
			//w=mer(e[v],e[oth]);
			//if(w>e[i])e[i]=w;
			//w.show();
		}
		//if(e[i].p>e[i].l-e[i].p)e[i].p=e[i].l-e[i].p;
		//b[1].p=b[1].l-b[1].p;
		//e[i].show(i);
	}
	printf("%.10lf\n",e[up].dis());
}
int main(){
	sol();
	return 0;
}

代码2(三个顶俩代码)

发现无需维护长度l和距一端的位置p,只维护右半边伸出去的最大值即可

每次尝试一下翻或不翻

#include <bits/stdc++.h>

using namespace std;
int n,l[30],w[30],x[1100000];
double f[1100000];

int main()
{
    int i,j;
    scanf("%d",&n);
    for(i=0;i<n;i++)
        scanf("%d",&l[i]);
    for(i=0;i<n;i++)
        scanf("%d",&w[i]);
    for(i=1;i<(1<<n);i++)
    {
    	for(j=0;j<n;j++)
    		if(i&(1<<j))
    			break;
    	x[i]=x[i-(1<<j)]+w[j];
    }
    for(i=1;i<(1<<n);i++)
    {
    	for(j=0;j<n;j++)
    		if(i&(1<<j))
    			f[i]=max(f[i],max(f[i^(1<<j)]+double(0.5*w[j]*l[j])/x[i],l[j]-double(0.5*w[j]*l[j])/x[i]));
    }
    printf("%.12lf\n",f[(1<<n)-1]);
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1316865.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数据结构】使用循环链表结构实现约瑟夫环问题

目录 1.循环链表的定义 2.约瑟夫环问题 3.创建循环链表 4.删除节点操作 5.打印所有节点 6.实现约瑟夫环问题的完整程序代码 &#x1f308;嗨&#xff01;我是Filotimo__&#x1f308;。很高兴与大家相识&#xff0c;希望我的博客能对你有所帮助。 &#x1f4a1;本文由Filotimo_…

基于Java SSM框架实现智能停车场系统项目【项目源码+论文说明】

基于java的SSM框架实现智能停车场系统演示 摘要 本论文主要论述了如何使用JAVA语言开发一个智能停车场管理系统&#xff0c;本系统将严格按照软件开发流程进行各个阶段的工作&#xff0c;采用B/S架构&#xff0c;面向对象编程思想进行项目开发。在引言中&#xff0c;作者将论述…

MySQL数据库的基础概念

目录 顾名思义&#xff0c;数据库是用于存储数据的&#xff0c;那这些数据被存储在哪呢&#xff1f; 文件也能存储数据&#xff0c;那在这个基础上&#xff0c;为什么还要搞出一个数据库来存储数据呢&#xff1f; MySQL的客户端登录/退出指令、服务端的启动/关闭指令 数据…

oracle怎么导入dmp文件??????

目录 oracle怎么导入dmp文件&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f; 先看&#xff1a; 方法一&#xff1a;【推荐】 winR输入 输入&#xff1a; 检验&#xff1a; 导入成功&#xff01; 方法二&#xff1a; 直接在 PLSQL Developer…

技术探秘:在RISC Zero中验证FHE——由隐藏到证明:FHE验证的ZK路径(1)

1. 引言 开源代码实现见&#xff1a; https://github.com/hashcloak/fhe_risc0_zkvm&#xff08;Rust&#xff09;https://github.com/weikengchen/vfhe-profiled&#xff08;Rust&#xff09;https://github.com/l2iterative/vfhe0&#xff08;Rust&#xff09; L2IV Resea…

一问掌握SpringBoot常见注解,后无压力。

文章目录 一、&#x1f50e; SpringBoot常用注解大全&#x1f341;&#x1f341; 01. RequestMapping 注解&#x1f341; 1.1. RequestMapping 是什么&#xff1f;&#x1f341; 1.2. RequestMapping 特点有哪些&#xff1f;&#x1f341; 1.3. RequestMapping 作用是什么&…

SpringBoot中处理处理国际化

SpringBoot中处理处理国际化 1. 创建SpringBoot项目2. resource下创建i18n目录3. 右键i18n新建资源包4. 弹框中添加需要支持的国际化语言5. messages.properties中添加需要国际化的键6. application.yaml添加配置7. 国际化工具8. 使用功能9 场景问题 1. 创建SpringBoot项目 2.…

智能配电房在线监测系统

智能配电房在线监测系统是一个综合性的系统&#xff0c;依托电力智慧运维工具-电易云&#xff0c;主要用于监控和调整配电房的环境、安防和电气设备状态。以下是该系统的一些主要功能和特点&#xff1a; 环境监控&#xff1a;实时监测配电房内的温度、湿度、SF6气体浓度、臭氧浓…

论文阅读笔记(12月15)--DialogXL

论文阅读笔记(12月15)–DialogXL 基本情况介绍&#xff1a; 作者&#xff1a;Weizhou Shen等 单位&#xff1a;中山大学 时间&期刊&#xff1a;AAAI 2021 主题&#xff1a;对话情绪识别(ERC)–文本模态 论文链接&#xff1a;https://ojs.aaai.org/index.php/AAAI/article…

如何在Go中并发运行多个函数

引言 Go语言的一个流行特性是它对并发的一流支持,即一个程序可以同时做多件事。随着计算机从更快地运行单个代码流转向同时运行更多代码流,能够并发地运行代码正在成为编程的重要组成部分。为了让程序运行得更快,程序员需要把程序设计成并发运行,这样程序中并发的每一部分…

HQL优化之数据倾斜

group by导致倾斜 前文提到过&#xff0c;Hive中未经优化的分组聚合&#xff0c;是通过一个MapReduce Job实现的。Map端负责读取数据&#xff0c;并按照分组字段分区&#xff0c;通过Shuffle&#xff0c;将数据发往Reduce端&#xff0c;各组数据在Reduce端完成最终的聚合运算。…

SpringCloud-高级篇(八)

&#xff08;1&#xff09;TCC模式 前面学了XA和AT模式&#xff0c;这两种模式最终都能实现一致性&#xff0c;和隔离性&#xff0c;XA是强一致&#xff0c;AT是最终一致&#xff0c;隔离性呢XA是在第一阶段不提交&#xff0c;基于事务本身的特性来完成隔离&#xff0c;AT则是…

MongoDB表的主键可以重复?!MongoDB的坑

MongoDB表的主键可以重复&#xff1f;&#xff01; 眼见为实&#xff1f; 碰到一个奇怪的现象&#xff0c; MongoDB的一个表居然有两个一样的_id值&#xff01; 再次提交时&#xff0c;是会报主键冲突的。那上图&#xff0c;为什么会有两个一样的_id呢&#xff1f; 将它们的…

【halcon深度学习】目标检测的数据准备过程中的一个库函数determine_dl_model_detection_param

determine_dl_model_detection_param “determine_dl_model_detection_param” 直译为 “确定深度学习模型检测参数”。 这个过程会自动针对给定数据集估算模型的某些高级参数&#xff0c;强烈建议使用这一过程来优化训练和推断性能。 过程签名 determine_dl_model_detection…

10 新字符设备驱动文件

一、新字符设备驱动原理 因为 register_chrdev 和 unregister_chrdev 两个函数是老版本驱动文件&#xff0c;现在可以用新字符设备驱动 API 函数。 1. 分配和和释放设备号 使用 register_chrdev 函数注册字符设备的时候只需要给定一个主设备号即可&#xff0c;但是这样会带来两…

【面试】广告优化

a1&#xff1a;点击率公式是什么&#xff1f;点击率低的原因是什么&#xff1f; 点击率点击/曝光&#xff0c;点击率低的原因主要有两点&#xff1a;一是创意不吸引人&#xff1b;二是目标受众不准确/定向过宽不精确&#xff0c;广告曝光给了对产品不感兴趣用户 a2&#xff1a;…

数据库——关系数据的规范化:范式判断【知识点罗列+例题讲解】

知识点罗列&#xff1a; 各种范式之间的关系 1.第一范式1NF&#xff1a; 如果关系模式R中所有的属性都具有原子性&#xff0c;均是不可再分的&#xff08;一个属性不能再被分解成更小的数据单元&#xff09;&#xff0c;则称R属于第一范式&#xff0c;简称1NF&#xff0c;记作R…

linux常见错误

1.E45: ‘readonly‘ option is set (add ! to override) 首先使用以下命令从Vim编辑器中出来&#xff1a;:qa!(强制退出) 接下来&#xff0c;使用sudo vim filename和更高版本&#xff1a;:wq 2.Bash script – "/bin/bash^M: bad interpreter: No such file or direc…

yolov5单目测距+速度测量+目标跟踪

要在YOLOv5中添加测距和测速功能&#xff0c;您需要了解以下两个部分的原理&#xff1a; 单目测距算法 单目测距是使用单个摄像头来估计场景中物体的距离。常见的单目测距算法包括基于视差的方法&#xff08;如立体匹配&#xff09;和基于深度学习的方法&#xff08;如神经网…