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 rectangular box in which they fit.All circles must touch the bottom of the box. The figure below showsan acceptable packing for a set of circles (although this may not bethe optimal packing for these particular circles). Note that in anideal 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. Thesubsequent n lines each contain a series of numbers separated byspaces. The first number on each of these lines is a positive integer m, m<=8, which indicates how many other numbers appear on thatline. The next m numbers on the line are the radii of the circleswhich must be packed in a single box. These numbers need not beintegers.

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 canpack the circles. Each case should be output on a separate line by itself,with three places after the decimal point. Do not output leading zeroesunless 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

求能放置所给圆的矩形的最小长度。这道题有一些细节没注意到的话就会无限WA,刚开始我想的是把所有圆全排列,把每个情况的长度算出来求最小值,结果WA了,因为算每个情况长度的时候,我是假设每个圆都与前一个圆相切,实际并不一定这样,比如有两个很大的圆相切,他们中间可以有许多小圆,与这两个圆并不一定相切,所以用之前的方法算出来结果就小了。在网上参考了别人的代码,发现他们是设置了一个数组记录圆心坐标,求每个圆心坐标的时候,是求出与之前圆相切的圆的圆心坐标的最大值,因为目前考虑的圆肯定是最右的圆,所以它的圆心坐标肯定最大,又由于要矩形长度最短,所以至少与之前的某一个圆相切(不一定是前一个)。最左边的坐标就是圆心坐标减去半径大小的最小值,最右边的坐标就是圆心坐标加上半径大小的最大值,最右边减去最左边的值的最小值就是矩形的最小长度。

AC的代码如下:

#include 
   
   
    
    

using namespace std;

int main()
{
    int n;
    cin>>n;
    while(n--)
    {
        int m;
        cin>>m;
        double a[10];
        for(int i=1; i<=m; i++)
            cin>>a[i];
        double MIN=1e15;
        double p[10];
        sort(a+1,a+1+m);
        do
        {
            p[1]=a[1];
            double ll=p[1]-a[1];
            double rr=p[1]+a[1];
            for(int i=2; i
    
    
   
   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值