POJ 1862 Stipies 解题报告

本文介绍了一种利用C++ STL中的priority_queue优化特定算法的方法。该算法的目标是最小化通过特定操作后剩余的单一数值。文章详细展示了如何通过不断选取最大值进行运算,最终达到优化目标的过程。

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

题意很简单,就是给定你一系列的数值,任意挑选其中两个数a和b,得到一个新的数2*sqrt(a*b),然后再将这个新的个放回。一直这样下去,直到只剩下一个数。求剩下的这个数最小是多少。

使用贪心策略,不断挑选两个最大的数组成一个新的数并放回原数列,再挑选最大的两个数……最到只乘一个数为止。

根据以上分析,知道使用C++STL中的priority_queue很简便。

以下是代码:

#include <iostream> #include <queue> #include <cmath> using namespace std; int main() { /*使用默认的以大数表示具有较大的优先级 *如要使用小的数具有较大的优先级,可以用: *priority_queue<double, vector<double>, greater<double> > priQue; *定义,并在头文件中包含#include <functional> */ priority_queue<double> priQue; int N; cin >> N; for(int i = 0; i < N; i++) { double w; cin >> w; priQue.push(w); } /* while(!priQue.empty()) { cout << priQue.top() << endl; priQue.pop(); } */ while(priQue.size() != 1) { double first, second; first = priQue.top(); priQue.pop(); second = priQue.top(); priQue.pop(); double newStri = 2 * sqrt(first * second); priQue.push(newStri); } cout.setf(ios::fixed); cout.precision(3); cout << priQue.top() << endl; return 0; }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值