二分法经典习题——HDU1969

本文介绍了一个使用C++编写的程序,该程序能够根据输入的半径计算多个饼状区域的面积,并通过二分查找算法找到合适的面积阈值来确保公平分配。文章中的代码实现了对每个饼状区域面积的计算,然后通过调整阈值来确定如何将这些区域公平地分配给指定数量的人。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <iostream>
#include <cmath>
#include <iomanip>
using namespace std;

double pie[10005];
int T, N, F;
double PI = acos(-1.0);

bool test(double x)
{
int cnt = 0;
for(int i=1; i<=N; ++i)
cnt += int(pie[i]/x);
if(cnt >= F+1)
return 1;
else
return 0;
}

int main()
{
cin >> T;
double rad;
double sum;
while(T--)
{
cin >> N >> F;
sum = 0.0;
for(int i=1; i<=N; ++i)
{
cin >> rad;
pie[i] = rad*rad*PI;
sum += pie[i];
}
double l = 0.0;
double r = sum/(F+1);
double mid;
while(r-l > 1e-6)
{
mid = (l+r)/2.0;
if(test(mid))
l = mid;
else
r = mid;
}
cout << fixed << setprecision(4) << mid << endl;
}
}

转载于:https://www.cnblogs.com/tianxia2s/p/3851053.html

### Python 中二分法的练习题示例 以下是基于提供的引用以及相关知识整理的一个完整的 Python 二分法习题目及其解答: #### 练习题描述 给定一个已排序数组 `arr` 和目标值 `target`,编写一个函数来判断该目标值是否存在于数组中。如果存在,则返回其索引;否则返回 `-1`。 --- #### 解决方案 可以采用递归方式实现二分查找算法。以下是一个具体的例子[^3]: ```python def binary_search_recursive(arr, target, left, right): if left > right: # 基本条件:当左指针超过右指针时停止搜索 return -1 mid = (left + right) // 2 # 计算中间位置 if arr[mid] == target: # 如果找到目标值 return mid elif arr[mid] > target: # 如果目标值小于中间值,在左侧继续查找 return binary_search_recursive(arr, target, left, mid - 1) else: # 否则在右侧继续查找 return binary_search_recursive(arr, target, mid + 1, right) # 测试用例 sorted_array = [5, 7, 11, 22, 27, 33, 39, 52, 58] result = binary_search_recursive(sorted_array, 11, 0, len(sorted_array) - 1) if result != -1: print(f"元素 {11} 的索引为: {result}") else: print("未找到指定元素") ``` 上述代码通过递归方法实现了二分查找逻辑,并能够正确处理输入数据中的边界情况。 --- 另一种常见的实现方式是非递归版本的二分查找算法。这种形式通常更加高效且易于理解: ```python def binary_search_iterative(arr, target): left, right = 0, len(arr) - 1 while left <= right: mid = (left + right) // 2 if arr[mid] == target: return mid elif arr[mid] < target: left = mid + 1 else: right = mid - 1 return -1 # 使用迭代版测试相同功能 iter_result = binary_search_iterative(sorted_array, 11) if iter_result != -1: print(f"迭代法查找到元素 {11} 的索引为: {iter_result}") else: print("迭代法未能找到指定元素") ``` 此代码片段展示了如何利用循环结构完成相同的任务,适合初学者学习基础概念的同时提高效率。 --- #### 关于复杂度分析 无论是递归还是非递归的形式,时间复杂度均为 O(log n),其中 n 表示列表长度。这是因为每次比较都会将待搜寻范围缩小一半所致。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值