poj 1862 還是哈夫曼思想貪心

題意:科學家發現一種奇怪的玩意,他們有重量Wi,
            如果他們碰在一起,總重變成2*sqrt(t1*t2)。

            要求出最終的重量的最小值。

思路:果然A題多點經驗就用上了,跟農夫鋸木頭那個一個思路,哈夫曼思想,把所有重量放堆裏,每次取倆最小的處理再放堆裏,最後堆剩下的最後元素就是答案了

代碼:

#include <iostream>
#include <queue>
#include <cstdio>
#include <vector>
#include <cmath>
#include <algorithm>
using namespace std;
//題目大意:科學家發現一種奇怪的玩意,他們有重量weight,
//如果他們碰在一起,總重變成2*sqrt(m1*m2)。
//要求出最終的重量的最小值。
int n;
double a[2000];
void input()
{
    for(int i = 0 ; i < n ; i++)
        cin >> a[i];
}
void solve()
{
    double ans = 0.000;
    priority_queue <double , vector<double> , less<double> > q;
    for(int i = 0 ; i < n ; i++)
        q.push(a[i]);

        while( q.size() != 1)
        {
           double t = q.top();
           q.pop();
           double t1 = q.top();
           q.pop();
           q.push( 2*sqrt(t*t1) );
        }
        cout.setf( ios::fixed );
        cout.precision(3);<span style="white-space:pre">	</span>
        cout << q.top() << endl;<span style="white-space:pre">	</span>//cout輸出用了47MS
//        ans = q.top();
//        printf("%.3lf\n",ans);<span style="white-space:pre">	</span>//printf 0MS無壓力
}<span style="white-space:pre">					</span>//所以說能用C的還是用C的吧,這次當練cout格式化輸出了
int main()
{
   #ifdef H_R
    freopen("in.txt","r",stdin);
   #endif // H_R
   cin.tie(false);
   ios::sync_with_stdio(false);
   while(cin >> n)
   {
       input();
       solve();
   }
    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章