poj2833

本文介绍了如何利用STL优先队列特性,通过维护两个优先队列来存储最大和最小元素,进而实现特定数值操作的高效算法。详细解释了输入数据的读取、队列的操作、以及最终输出结果的计算过程。

stl优先队列,保持两个优先队列一个存大树一个是小数

#include<iostream>

#include<queue>

using namespace std;

 

priority_queue<int>big,little;

 

int main()

{

__int64 sum;

int a,i,p;

int n1,n2,n;

while(1)

{

sum=0;

scanf("%d%d%d",&n1,&n2,&n);

if(n1==0&&n2==0&&n==0)

break;

for(i=0;i<n;i++)

{

scanf("%d",&a);

sum+=a;

big.push(-a);//保存最小的负数,也就是最大的数

if(big.size()>n1)

big.pop();

little.push(a);//保存实际小数

if(little.size()>n2)

little.pop();

}

for(i=0;i<n1;i++)

{

sum+=big.top();

big.pop();

}

for(i=0;i<n2;i++)

{

sum-=little.top();

little.pop();

}

printf("%.6lf/n",(double)sum/((double)(n-n1-n2)));

}

return 0;

}

 

POJ2833问题可使用优先队列(堆)来解决,以下是具体分析和代码实现。 ### 思路 1. **使用优先队列**:维护两个优先队列,一个最小堆用于存储最大的`n1`个元素,一个最大堆用于存储最小的`n2`个元素。 2. **遍历元素**:遍历给定的`n`个正整数,同时记录所有元素的总和。 3. **更新堆**:在遍历过程中,若元素大于最小堆的堆顶元素,则替换堆顶元素;若元素小于最大堆的堆顶元素,同样替换堆顶元素。 4. **计算平均值**:遍历结束后,从总和中减去最小堆和最大堆中元素的和,再除以剩余元素的数量,即可得到平均值。 ### 代码实现 ```python import heapq while True: # 读取输入 n1, n2, n = map(int, input().split()) if n1 == 0 and n2 == 0 and n == 0: break # 读取n个正整数 numbers = list(map(int, input().split())) # 初始化总和 total_sum = sum(numbers) # 初始化最小堆和最大堆 max_n1 = [] min_n2 = [] # 遍历元素 for num in numbers: if len(max_n1) < n1: heapq.heappush(max_n1, num) elif num > max_n1[0]: heapq.heappushpop(max_n1, num) if len(min_n2) < n2: heapq.heappush(min_n2, -num) elif -num > min_n2[0]: heapq.heappushpop(min_n2, -num) # 计算最大的n1个元素和最小的n2个元素的和 sum_max_n1 = sum(max_n1) sum_min_n2 = -sum(min_n2) # 计算剩余元素的平均值 average = (total_sum - sum_max_n1 - sum_min_n2) / (n - n1 - n2) print(average) ``` ### 复杂度分析 - **时间复杂度**:$O(n log(n1 + n2))$,其中`n`是元素的数量,`n1`和`n2`分别是要去掉的最大和最小元素的数量。 - **空间复杂度**:$O(n1 + n2)$,主要用于存储两个优先队列。 该算法在时间限制6000ms和空间限制10000KB的条件下可以正常运行。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值