UVA - 10012 How Big Is It?(全排列 堆球问题)

【锂离子电池力学耦合及相场法模拟技术与应用】 8. 电化学仿真软件的使用与案例分析 (1) 各向异性纳米线锂化应力分析(实例讲解1) (2) 化学反应及死锂现象研究(案例分析2)(3) 锂化循环损伤计算(案例分析3)6. 4. 电池材料的力学与电化学耦合性能分析(1) 耦合效应对电池性能的影响(2) 耦合模型的验证与应。5. 5. 电池颗粒、极片、电芯尺度力-电-化-热多场耦合模型概述力学-7. 颗粒尺度耦合模型在电池失效分析中的应用。2. 2. 电池电极材料的分类与特性。5. (2) 耦合模型的验证与应用。电化学耦合模型与仿真。 阅读详情

  How Big Is It? 

Ian's going to California, and he has to pack his things, including his collection of circles. Given a set of circles, your program must find the smallest rectangular box in which they fit. All circles must touch the bottom of the box. The figure below shows an acceptable packing for a set of circles (although this may not be the optimal packing for these particular circles). Note that in an ideal packing, each circle should touch at least one other circle (but you probably figured that out).

Input 

The first line of input contains a single positive decimal integer  n ,  n <=50. This indicates the number of lines which follow. The subsequent  n  lines each contain a series of numbers separated by spaces. The first number on each of these lines is a positive integer  m ,  m <=8, which indicates how many other numbers appear on that line. The next  m  numbers on the line are the radii of the circles which must be packed in a single box. These numbers need not be integers.

Output 

For each data line of input, excluding the first line of input containing  n , your program must output the size of the smallest rectangle which can pack the circles. Each case should be output on a separate line by itself, with three places after the decimal point. Do not output leading zeroes unless the number is less than 1, e.g.  0.543 .

Sample Input 

3
3 2.0 1.0 2.0
4 2.0 2.0 2.0 2.0
3 2.0 1.0 4.0

Sample Output 

9.657
16.000
12.657

题目大意:
给定n个大小不等的圆, 要将这n个圆排进一个矩形框中,要求各个圆都要与矩形框的底边相切。
然后从这n各院的所有排列中找出有最小长度的圆排列。如上图所示。


解析:一道比较恶心的题目,原来以为只是简单的全排列的水题,于是直接调用了next_pertutation()来进行排列,但是wa了一遍。

因为这道题有个很容易出错的地方,如下图。

1.  中间的圆很小,而旁边两个圆比较大,中间的被”淹没“了

399x253

2. 最前面的那个或最后面的那个圆很小,也被淹没了

440x316



遇到这种情况怎么办呢。

我的参考了GG学长的办法,
一开始把第一个圆放到最左端,接下来后面的圆堆放在和前面一个圆相切的位置,然后和前面摆好的圆比较检查是否会出现两个圆相交的情况,如果是的话就把当前圆向右移动到相切的位置。
然后判断宽度,如果当前的半径 > 当前的x值,表示超过最左端的位置,此时x取其半径的值。

#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <math.h>

using namespace std;
const int N = 10;

struct Point{
	double x,y;
};

double r[N];
int n;

double cdis(double r1,double r2) {
	double l,h;
	l = r1 + r2;
	h = r1 - r2;
	return sqrt( l*l - h*h );
}

double pdis(Point a,Point b) {
	double dx,dy;
	dx = a.x - b.x;
	dy = a.y - b.y;
	return sqrt(dx*dx+dy*dy);
}

double solve() {
	Point p[N];
	double maxa = 1e-9;
	for(int i = 0; i < n; i++) {
		p[i].y = r[i];
		if( i == 0) {
			p[i].x = r[i];
		}
		else {
			p[i].x = p[i-1].x + cdis(r[i],r[i-1]);
		}

		if(p[i].x < r[i]) { //这步很关键,判断新的相切圆,是否越界,或者说超过最左端,如果超过最左边则当前x = r[i]
			p[i].x = r[i];
		}
		for(int j = 0; j < i; j++) { //判断与之前的圆是否出现,两圆相交的情况
			if( r[i]+r[j] > pdis(p[i],p[j]) ) { //如果两圆相交,则新的x值,等于相交圆的x+水平距离
				p[i].x = p[j].x + cdis(r[i],r[j]);
			}
		}
		maxa = max(maxa,p[i].x + r[i]);
	}
	return maxa;
}

int main() {
	int t;
	double mina,sum;
	while( scanf("%d",&t) != EOF) {
		while( t--) {
			scanf("%d",&n);
			for(int i = 0; i < n; i++) {
				scanf("%lf",&r[i]);
			}
			mina = solve();
			sort(r,r+n);
			do {
				sum = solve();
				mina = min(mina,sum);
			}while(next_permutation(r,r+n));
			printf("%.3lf\n",mina);
		}
	}
	return 0;
}

另外附上100组样例
input
100
8 1.344 0.852 0.269 1.472 3.170 1.329 0.579 2.847
3 0.196 0.009 0.735
7 0.030 3.821 1.368 1.545 5.434 0.934 0.105
3 0.467 0.889 0.461
7 0.744 1.173 1.035 0.354 0.300 1.102 0.708
6 1.419 5.220 1.208 0.714 1.741 8.151
7 0.453 2.879 1.834 3.639 1.361 0.558 1.280
8 10.519 0.553 4.513 0.911 1.170 0.293 0.678 1.463
2 1.069 0.616
5 1.780 3.458 2.220 0.659 0.750
8 0.146 1.085 7.379 0.992 4.334 3.427 0.608 2.375
1 0.155
5 0.119 2.052 0.379 2.150 0.693
4 63.499 0.249 3.666 0.322
5 1.890 4.796 0.583 0.187 0.347
1 1.079
4 0.209 1.862 1.430 5.867
8 3.265 0.590 0.054 1.583 0.074 1.585 0.525 0.989
4 2.232 7.205 150.375 1.467
1 11.740
6 10.779 3.807 1.716 0.428 0.536 1.224
4 1.071 2.685 0.794 0.117
4 0.608 0.486 0.135 4.533
1 0.469
8 2.294 0.756 10.556 3.538 2.250 0.383 0.858 1.160
3 2.463 1.446 1.809
5 2.174 0.154 0.322 0.539 0.847
7 0.429 1.694 2.170 0.214 0.369 0.275 8.182
5 2.159 0.739 1.132 0.733 0.328
3 7.906 3.212 1.724
1 3.759
4 2.750 1.045 1.434 19.391
2 0.241 12.710
4 0.900 0.978 0.568 0.968
7 1.056 0.084 1.089 3.910 0.114 1.221 2.411
3 2.301 1.375 0.298
2 0.376 0.532
4 2.275 0.261 0.087 2.705
5 0.605 1.057 0.257 0.706 0.861
3 0.203 0.627 0.848
1 4.048
5 3.357 0.641 4.038 0.864 0.667
8 0.252 0.416 1.932 0.365 0.621 0.502 8.299 0.318
2 40.436 3.087
7 0.682 2.496 0.322 0.786 0.128 0.625 0.438
4 1.042 2.291 0.724 1.504
8 1.460 5.581 0.001 25.125 1.713 2.704 0.342 0.716
6 0.102 0.469 0.859 4.451 2.170 1.602
8 1.830 14.377 0.517 0.685 1.184 0.001 1.011 1.385
6 0.855 0.000 1.823 0.768 0.426 1.157
5 0.647 2.051 0.537 1.676 0.339
3 3.623 0.364 0.994
8 0.947 1.024 0.263 0.773 1.279 4.074 49.961 0.065
2 6.345 16.925
5 4.651 0.156 1.075 0.480 2.629
5 1.256 0.227 0.054 0.035 1.912
2 1.203 0.751
7 5.175 0.518 1.108 8.091 0.274 1.003 0.555
6 0.291 0.175 0.370 7.216 0.554 1.628
7 0.847 0.676 0.577 0.492 1.407 0.868 10.257
2 0.812 1.108
6 1.286 19.802 0.499 0.333 0.598 13.306
3 0.688 0.263 21.964
1 0.748
8 0.203 1.499 23.346 1.314 2.114 0.833 1.757 14.082
7 7.280 0.942 0.389 1.521 1.467 0.963 2.634
6 0.588 0.239 0.647 2.450 1.536 0.291
8 22.087 1.160 10.010 0.527 1.168 0.720 0.184 0.670
7 3.225 1.402 1.486 2.549 1.023 1.008 2.263
2 0.955 1.202
5 3.073 7.774 6.587 8.906 1.282
6 0.301 0.835 4.213 0.848 5.414 1.315
4 0.731 2.590 2.308 0.235
1 1.250
8 0.383 3.919 0.738 0.429 0.663 0.698 1.331 1.531
7 1.280 0.356 0.686 1.039 0.680 0.058 0.490
6 1.031 0.174 1.945 0.773 0.680 0.466
8 0.413 0.689 4.510 0.694 1.453 3.161 0.971 0.283
3 0.781 1.030 1.666
3 0.061 1.953 1.654
3 0.036 0.741 0.477
3 1.826 2.268 2.851
7 0.319 2.537 1.363 35.278 0.172 6.054 4.533
2 5.517 1.447
2 0.226 0.493
8 2.559 0.443 4.470 1.445 1.162 0.258 0.193 1.644
4 0.563 3.274 1.186 0.803
8 0.303 7.870 17.105 0.734 1.000 6.424 3.592 2.105
7 1.028 2.475 1.486 0.505 0.480 0.133 1.702
2 0.528 1.190
4 8.753 0.326 0.944 0.843
2 0.870 1.001
4 0.324 0.899 0.772 5.190
8 0.182 2.026 12.486 2.303 1.066 4.099 0.923 1.286
7 2.644 0.931 0.367 0.779 0.618 0.190 11.166
8 1.903 0.002 1.174 3.766 0.789 1.874 7.221 0.830
8 0.579 0.657 0.518 0.567 19.806 0.080 0.186 2.428
6 0.778 3.006 5.973 8.024 0.042 0.268
7 0.148 0.226 3.190 0.146 1.708 0.398 0.317
5 2.595 0.559 0.306 1.292 1.908
output
20.334
1.690
21.870
3.497
9.809
28.015
20.397
28.812
3.308
14.987
32.716
0.310
9.063
126.998
12.707
2.158
15.695
14.333
300.750
23.480
27.398
8.177
9.066
0.938
31.701
11.251
6.269
19.737
8.877
22.398
7.518
38.782
25.420
6.718
17.124
7.233
1.802
9.941
6.453
3.018
8.096
14.976
18.239
80.872
8.694
10.299
54.389
15.754
28.754
9.145
8.777
8.412
99.922
43.996
15.114
6.267
3.855
26.208
15.699
20.514
3.817
65.572
43.928
1.496
73.691
23.309
9.041
61.835
23.824
4.300
49.918
20.044
10.248
2.500
15.232
8.357
8.829
18.325
6.712
7.202
2.407
13.743
70.560
12.615
1.387
20.281
9.581
61.570
13.133
3.303
17.506
3.737
10.409
34.572
24.677
27.367
39.612
32.294
9.566
11.336





RT-DETR改进策略【卷积层】| CGblock 内容引导网络 利用不同层次信息,提高多类别分类能力 (含二次创新) 本文记录的是利用中的模块优化的目标检测网络模型。通过局部特征提取器、周围环境提取器、联合特征提取器和全局环境提取器来提取局部特征、周围环境和全局环境信息,充分利用不同层次的信息。本文将其应用到中,并进行二次创新,使网络能够更好的处理多类别目标的分类能力。CGNet: A Light-Weight Context Guided Network for Semantic Segmentation1️⃣ 首先通过局部特征提取器floc(∗)floc(*)floc(∗)和周围环境提取器fsur(∗)f_{sur } 阅读详情

相关推荐

R语言WGCNA实战:从基因表达矩阵到模块可视化全流程(附避坑指南)

本文详细介绍了使用R语言进行WGCNA(加权基因共表达网络分析)的完整实战流程,涵盖从基因表达矩阵预处理、软阈值选择、网络构建与模块识别,到模块与表型关联分析及结果可视化的关键步骤。文章重点解析了代码实现,并提供了针对数据质量检查、参数调整等常见问题的避坑指南,帮助生物信息学研究者高效挖掘基因共表达模块的生物学意义。

weixin_29062823的博客 580

UVa 10012 - How Big Is It? 圆排列问题

题目链接: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=108&page=show_problem&problem=953 类型: 回溯 原题: Ian's going to California, and he has to pack his things,

D_Double's Journey 3612

Carla学习笔记(一)服务器跑carla本地显示窗口

其中host后替换为你的服务器IP,-carla-rpc-port和-p后为端口号,需要一致。python3 manual_control.py也可以替换为其他python脚本。因为电脑配置不够,所以在服务器跑carla,本地运行PythonAPI里的样例。把carla仓库的PythonAPI拷贝到本地,或者直接去官方里下载一下。

做题记录 4977

UVA How Big Is It?

题目如下: How Big Is It?  Ian's going to California, and he has to pack his things, including hiscollection of circles. Given a set of circles, your program mustfind the smallest r

hexiecs的技术专栏 1049

Aurix TC387 Ethernet代码解析之二_移植

英飞凌官方仅提供了TC397的例程,故需通过TC397例程来移植到TC387新建工程里。TC397官方例程名称【Ethernet_1_KIT_TC397_TFT】,网络上可以免费获取到,此处不赘述。使用工具【

m0_69929716的博客 884

中国IP发展之面面观

谢学军/邱善勤2006-1-25 9:29:28电子经理世界       IP远没有我们当初想象的那么简单   当SoC设计方法学刚刚传到国内的时候,学界为之欢呼雀跃,由于IP/SoC设计技术的使用,可以将发达国家用几年甚至十几年积累起来的设计技术直接为我所用,使中国的集成电路跳过漫长的积累阶段,迅速站到较高的起点上。因此在当时看来,IP/SoC设计技术是我国提升设计水平、发展

klxdmm305的专栏 1188

UVA10012 How Big Is It?【全排列+回溯】

Ian’s going to California, and he has to pack his things, including his collection of circles. Given a set of circles, your program must find the smallest rectangular box in which they fit. &amp;amp;nbsp;&amp;amp;nbs...

海岛Blog 787

神经网络基础-从零开始搭建一个神经网络

人工神经网络(Articial Neural Network,简写为ANN)也称为神经网络(NN),是一种模仿生物神经网络和功能的计算模型,人脑可以看做是一个生物神经网络,由众多的神经元连接而成,各个神经元传递复杂的电信号,树突接收到输入信号,然后对信号进行处理,通过轴突输出信号。人工神经网络也是类似,通过模仿人脑的“学习机器”,通过不断“看”数据(比如图片,数字),自己总结规律,最终学会预测(比如分类图片)在深度学习中,损失函数是用来衡量模型参数的质量的函数,衡量的方式是比较网络输出和真实输出的差异。

Zach的博客 4014

经典的递归问题(全排列、从n个球中取出m个球、最大公共子序列 )

一、在n个球中,任意取出m个球(不放回),有多少种不同的方法 运行截图: 代码如下: package sf_1; public class Main { public static int f(int n,int m){ /* * a b c ......ab ac bc * 内部含有一个幸运球 ...

qq_36717487的博客 1107

【AI编程】Vibe Coding 开发环境搭建与项目实战操作详解

Vibe Coding 开发环境搭建与项目实战操作详解

congge 7335

在Allegro设计界面中如何修改封装焊盘

在高密度板的情况下,SUIPLA(支持内层没有的焊盘摘掉)打勾,在高密度板的情况下,内层没有的焊盘摘掉可以增加走线的空间。3、修改完焊盘后,选择File→Update to Design(更新到设计)。然后关闭焊盘修改对话框即可。,将会定期不定期更新技术文章,互相学习交流。或者点击Options选项卡下要修改的焊盘,然后点击Edit修改。在Allegro PCB设计界面中修改封装焊盘的方法。2、然后点击封装上要修改的焊盘,右击选择Edit。修改完成后如下图所示。

bhxc809751502的博客 7806

uva 10012 How Big Is It?(下一个排序 + DFS)

How Big Is It?  Ian's going to California, and he has to pack his things, including his collection of circles. Given a set of circles, your program must find the smallest rectangular box

不慌不忙、不急不躁 1757

UVa 10012 - How Big Is It? 堆球问题 全排列+坐标模拟 数据

题意:给出几个圆的半径,贴着底下排放在一个长方形里面,求出如何摆放能使长方形底下长度最短。 由于球的个数不会超过8, 所以用全排列一个一个计算底下的长度,然后记录最短就行了。 全排列用next_permutation函数,计算长度时模拟着摆放就行了。 摆放时折腾了不久,一开始一个一个把圆放到最左端,然后和前面摆好的圆比较检查是否会出现两个圆重叠,是的话就把当前圆向右移动到相切的位置。然后判断

水果君の日常 2911

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

UVA 10012 How Big Is It?

UVA-10012题意:给出一堆圆的半径,求要用多长的矩形能把框住。 解题思路:枚举球的排列顺序(next_permutation大法好),然后判断球的圆心的位置应该在哪里。temp[x]表示圆心的位置,temp是和之前所有的圆求圆心位置中取最大值的那个(可能两个很大的圆中间有一堆小的,只和前一个计算圆心位置不够)。 怎么通过一直圆求新圆的圆心位置:r1,r1 d=r1+r2, t=abs

QzNarsh的博客 442

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

UVA 10012 How Big Is It?

UVA 10012 How Big Is It?题目大意:给出一组圆的半径,这组圆排成一排,要求都切于底面,求要用最少长为多少的长方形能装下它们解题思路:先全排列,然后回溯 注意点:每个圆不能只计算与上一个圆间的距离,因为可能上个圆可能很小导致圆直接与上上个圆相切而不接触上一个圆,同理,最后也不能直接加上最后一个圆的半径,因为可能最后一个圆特别小 所以每次访问一个圆时计算前几个圆与它的距离更新坐

ZeroLH00的博客 500

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

UVa Problem 10012 How Big Is It? (它有多大?)

// How Big Is It? (它有多大?) // PC/UVa IDs: 111308/10012, Popularity: B, Success rate: low Level: 3 // Verdict: Accepted // Submission Date: 2011-11-05 // UVa Run Time: 0.272s // // 版权所有(C)2011,邱秋。metaph

寂静山林 2780

uva 10012 How Big Is It?

题目地址: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=108&page=show_problem&problem=953 题目描述: How Big Is It?  Ian's going to California, and h

心之所向,无惧无悔! 1114

uva10012 How Big Is It?

有点小坑的一道题。。 一开始没多想就写了全排列看相邻两个球。。但是可能会有两个极大的圆。。。 用坐标来确定每一个球的点。。枚举当前点和之前已经确定了圆相切后确定最右边的坐标,最后确定RECT最大值。 题目: How Big Is It? Ian's going to California, and he has to pac...

aiezhen1717的博客 237

uva10012(How Big Is It?)-简单回溯

题目链接:点击打开链接

冲鸭,胖哒哒 的专栏 427

uva 10012 - How Big Is It?(排列 + 回溯)

题目:uva 10012 - How Big Is It? 题目大意:给出n个圆的半径,要求圆要和地面相切,求这样的圆怎么组合能够使得盒子的宽度最短。 解题思路:这题里面情况会有两个大圆相切,然后中间夹多个小圆,这样这些小圆的距离就不用算入盒子的宽度了,这里先用排列组合的方式将这几个圆全部的组合方式排列出来,这样这些圆的前后关系就定了,但是现在就需要判断这样的情况下的盒子的宽度

1142

[uva] 10012 - How Big Is It?

[uva] 10012 - How Big Is It? 【题目】http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=953 【题意】最多8个圆在同切一水平线,然后外相切,求其最小宽度。 【算法】简单几何 【题解】最多八个圆,所以全排列一遍,然后圆心从左

364

UVa 10012 - How Big Is It?

/* 暴力枚举,模拟放入圆。 半径为R1、R2的两个圆相切,通过勾股定理推出,两圆心的水平距离为 2sqrt(R1*R2) 注意到对一些特殊情况处理,如例子 4 1000.0 1.0 1.0 1.0 最坏时间复杂度为 8!,其实可以优化成 8!/2, 因为排序1、2、3 和 排序3、2、1求出来的值是相等的。 */ #include #include #include

cugfjp的专栏 452

uva 10012 How Big Is It?

此题大意:给定一定数量的圆,然后将其装在箱子里,求箱子最小的宽度 要求是:每个圆都必须与底部接触,同时每个圆必须与至少一个院邻接(这在程序中体现为相切) 。  注意点:就是打球非常大,而小球非常小。。 此题算法就是:暴力求解,加上一定的判断。 // // main.cpp // uva 10012 - How Big Is It? // // Created

最爱她! 400

UVa 10012 How Big is It? (计算几何+DFS)

可以说这道题目,涉及了很多知识点,是一道很好的题目。 首先这道题涉及了计算几何的知识,求圆心坐标的横距离进而求出圆心坐标;其次,这道题目数据不大,很容易想到dfs;最后这道题涉及到了全排列!理论上这道题还可以剪枝,步骤也不是很麻烦,但是不剪枝也是可以过的! 下面说一下我最开始的想法,这个想法很麻烦,最后wa了,简单说一下,就是从右向左判断,一次和圆相切,算出坐标,然后假定这个坐标,然后继续向左

AClion的专栏 1092

【UVA】10012 - How Big Is It?(暴力)

利用DFS枚举所有排列,之后每次添加一个圆的时候,他的位置是和前面所有已经添加圆的相切的位置的最大。 14383635 10012 How Big Is It? Accepted C++ 0.086 2014-10-20 11:07:33 #include #include #include #include using

花月阁 983
上一篇: UVA - 110 Meta-Loopless Sorts(元排序 回溯)
下一篇: FZU - 2107 Hua Rong Dao(回溯)
HelloWorld10086
博客等级 码龄12年 88粉丝 614原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值