1. 程式人生 > >堆排 luogu1090合併果子

堆排 luogu1090合併果子

#include<cstdio>
#include<iostream>
using namespace std;
int ans,s,hp[10005],n,siz,cnt;
void pus(int x)//輸(插)入 
{
cnt++;
hp[cnt]=x;
int now=cnt;
int fa=cnt/2;
while(now>1)
{
if(hp[now]>=hp[fa])
return;
else
{
swap(hp[now],hp[fa]);
now=fa,fa/=2;
}
}
}
int del()//刪除堆頂 維護堆 
{
int res=hp[1];
swap(hp[1],hp[cnt]);
cnt--;
int now=1;
while(2*now<=cnt)//有兒子 
{
int lison=2*now;
if(lison<cnt && hp[lison+1]<hp[lison])//有右兒子
lison++;
if(hp[now]>hp[lison])
swap(hp[now],hp[lison]),now=lison;
else break;
}
return res;

int main()
{
cin>>n;
int a;
for(int i=1;i<=n;i++)
{
cin>>a;
pus(a);//建堆 
}
for(int i=1;i<n;i++)
{
int a1=del();//提取兩個最小值
int a2=del();
int s=a1+a2;
ans+=s;
pus(s); 
}
cout<<ans<<endl;
return 0;
}

相關推薦

luogu1090合併果子

#include<cstdio>#include<iostream>using namespace std;int ans,s,hp[10005],n,siz,cnt;void pus(int x)//輸(插)入 {cnt++;hp[cnt]=x;int now=cnt;int fa=

樹-結構練習——合併果子之哈夫曼樹

#include <stdio.h> #include <stdlib.h> void quick(int a[],int l,int r) { int i,j,x; i=l; j=r; x=a[l];

B - 樹-結構練習——合併果子之哈夫曼樹

初試堆的一系列操作 Problem Description 在一個果園裡,多多已經將所有的果子打了下來,而且按果子的不同種類分成了不同的堆。多多決定把所有的果子合成一堆。 每一次合併,多多可以把兩堆果子合併到一起,消耗的體力等於兩堆果子的重量之和。可以看出,所有的果子經過n-1次合併

2127樹-結構練習——合併果子之哈夫曼樹

樹-堆結構練習——合併果子之哈夫曼樹 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Problem Description  在一個果園裡,多多已經將所有

Luogu1090合併果子[單調佇列]

/* ID:hh826532 PROB: LANG:C++ */ #define _FILE_ "" #include<iostream> #include<stdio.h> #include<algorithm> #incl

SDUTOJ 2127 樹-結構練習——合併果子之哈夫曼樹

#include<iostream> #include<stdlib.h> #define N 30000 using namespace std; int a[N+1],o=0; typedef struct { int weight; in

平衡+貪心 hdu1588 合併果子

題意:貪心任意石子合併 思路:平衡堆的模板和程式碼測試 #include<map> #include<set> #include<cmath> #include<ctime> #include<stack> #i

luogu1090,排序,貪心)合併果子

每一次合併,多多可以把兩堆果子合併到一起,消耗的體力等於兩堆果子的重量之和。可以看出,所有的果子經過n-1次合併之後,就只剩下一堆了。多多在合併果子時總共消耗的體力等於每次合併所耗體力之和。 例如

程式設計基礎20 合併果子

題目描述 在一個果園裡,多多已經將所有的果子打了下來,而且按果子的不同種類分成了不同的堆。多多決定把所有的果子合成一堆。     每一次合併,多多可以把兩堆果子合併到一起,消耗的體力等於兩堆果子的重量之和。可以看出,所有的果子經過n-1次合併之後,就只剩下一堆了。多多在合

合併果子(小根 手打)

題目描述 在一個果園裡,多多已經將所有的果子打了下來,而且按果子的不同種類分成了不同的堆。多多決定把所有的果子合成一堆。 每一次合併,多多可以把兩堆果子合併到一起,消耗的體力等於兩堆果子的重量之和。可以看出,所有的果子經過 n-1n−1 次合併之後, 就只剩

排序演算法(五)、排序 —— 合併果子

2004年NOIP全國聯賽普及組 題目描述: 在一個果園裡,多多已經將所有的果子打了下來,而且按果子的不同種類分成了不同的堆。多多決定把所有的果子合成一堆。 每一次合併,多多可以把兩堆果子合併到一起,消耗的體力等於兩堆果子的重量之和。可以看出,所有的果子經過n-1次合併之後,

合併果子(STL排序)

合併果子 來源: 2004年NOIP全國聯賽普及組 題目描述: 在一個果園裡,多多已經將所有的果子打了下來,而且按果子的不同種類分成了不同的堆。多多決定把所有的果子合成一堆。 每一次合併,多多可以把兩堆果子合併到一起,消耗的體力等於兩堆果子的重量之和。

CSU-1588 合併果子/單調佇列)

題意 有 nn 堆果子,第 ii 堆果子有 aiai 個,每次合併的代價是兩堆果子個數的總和,求總合並的最小代價。 1≤n≤10001≤n≤1000 思路 堆(優先佇列)的做法已經眾所周知,複雜

三種排序:快,歸並,

new swap 簡單 數組合並 col 最大 heapsort 堆排序 大神 轉自:http://www.cnblogs.com/LUO77/p/5798149.html (一)快排 快排考的是最多次的。之前看大神寫的算法很簡單,思想也很好。就一直用他的思想去思考快排

Java代碼實現

!= 大於 ava lse amp pri public largest turn 堆排復習: 結論:堆排算法時間復雜度為O(nlgn),額外空間復雜度為O(1); 在開始堆排序過程之前先要熟悉兩個結構 1,完全二叉樹:若設二叉樹的深度為h,除第 h 層外,其它各層 (1~

今日分資料結構作業:氣泡排序、、希爾排序、快……

先看實驗報告:  好吧,這次實驗報告沒有什麼好吐槽的,安安分分的寫了好久。 bug無數,雖然之前寫過,但是沒這麼詳細。 程式碼+註釋: import java.io.*; import java.util.Arrays; public class Main3 {

JAVA實現冒泡、歸併、希爾、、快速、插入、簡單選擇、排序演算法

氣泡排序 public void bubbleSort(int []nums) { int exchange=nums.length-1; while(exchange!=0) { int bound=exchange; exchange=0; for(i

洛谷 P1090 合併果子 STL優先佇列

優先佇列 #include<iostream> #include<queue> using namespace std; int n,a[10005]; long long sum; priority_queue<int,vector<int>,greater

NOIP2004合併果子(提高組T2)————優先佇列STL,貪心

題解:本題主要考查優先佇列STL,貪心。若要體力最小,就要將最小的果合併,合併後的果子再入隊。 程式碼如下: #include<iostream> #include<queue> using namespace std; priority_queue<in

二分查詢、快

演算法思想不做贅述。 二分查詢: int binarySearch(int *a,int len,int key){ int left=0,right=len-1; while(left<==right){ int mid=left+(right-l