1813 - 找出最大的圆

题目描述

给定一批圆的半径(半径值互不相同),找出这些圆中面积最大的圆,输出它的编号和面积。

圆的面积 = 3.14×半径×半径3.14×半径×半径,面积输出时保留 22 位小数。

输入

第一行一个整数 𝑛n(𝑛<100n<100);

第二行 𝑛n 个以空格相隔的整数,代表这 𝑛n 个圆的半径(半径值都在1∼10001∼1000之间)。

输出

输出有 22 个数,用一个空格隔开。

第 11 个数代表最大圆的面积(保留22位小数)。

第 22 个数代表这个最大圆是这组数的第几个圆。

样例

输入

复制

6
2 1 6 3 4 5 
输出

复制

113.04 3

答案:

#include<bits/stdc++.h>
//#include <iostream>//小数头文件可以不要
using namespace std;
int main(){
    int n,i,k=0,o,a[101];//k是最大值,o是最大值的下标。
    cin>>n;
    for(i=0;i<n;i++){
        cin>>a[i];
        if(a[i]>k){
            k=a[i];
            o=i;
        }
    }
    cout<<k*k*3.14<<" "<<o+1;
}

  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这个问题可以用一种叫做二分答案的方法来解决。 具体来说,我们可以二分答案来得到最大的半径。假设当前二分的答案为 r,那么我们可以遍历所有的点,以每个点为心,半径为 r,看是否有一个可以包含所有的点。如果存在这样的,说明当前的半径 r 可行,我们可以继续在更大的半径范围内继续二分;否则,说明当前半径 r 不可行,我们需要在更小的半径范围内继续二分。 具体实现时,我们可以使用一个循环来不断缩小半径的范围,直到最后得到最大的可行半径。具体的代码实现可以参考下面的示例: ```python import math def check(points, r): n = len(points) for i in range(n): for j in range(i+1, n): dist = math.sqrt((points[i][0]-points[j][0])**2 + (points[i][1]-points[j][1])**2) if dist > 2*r: return False return True def max_circle(points): n = len(points) left, right = 0, 10000 while right - left > 1e-4: mid = (left + right) / 2 if check(points, mid): left = mid else: right = mid return left points = [(0, 0), (1, 1), (2, 2), (4, 4)] print(max_circle(points)) # 输出 1.4142 ``` 在上面的代码中,我们首先定义了一个辅助函数 check,用来检查当前的半径 r 是否可行。具体来说,对于每一对点,如果它们之间的距离大于 2r,则说明当前的半径 r 不可行。如果所有的点都可以被一个覆盖,则说明当前的半径 r 可行。 在主函数 max_circle 中,我们使用二分答案的方法来找到最大的可行半径。具体来说,我们使用一个 while 循环来不断缩小半径的范围,直到最后得到最大的可行半径。在每一次循环中,我们首先计算出当前的二分答案 mid,然后调用辅助函数 check 来检查当前的半径是否可行。如果当前的半径可行,我们就将左边界 left 更新为 mid;否则,我们将右边界 right 更新为 mid。最后,我们返回左边界 left 作为最大的可行半径。 上面的代码可以在大多数情况下正确地找到最大的半径,但是由于浮点数精度的问题,有时候可能会得到稍微偏小一些的结果。如果需要更高精度的计算,可以使用第三方库,如 SymPy。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值