1. 程式人生 > >煎餅(堆)

煎餅(堆)


雖然不喜歡吃這個煎餅

題意:給出一列數列,隨時求其中位數並刪除。。

思路:用兩個堆,,左邊一個堆,,右邊一個堆,並維持其個數差不超過1.

             一開始自己寫的堆,,自己測試的資料也是對我,就是一直WA,,

           後來改用priority_queue。,,就直接簡單粗暴 了

#include<iostream>
#include<cstdio>
#include<map>
#include<queue>
#include<vector>
#include<ctype.h>
#include<algorithm>

using namespace std;

#define  N 100010

priority_queue<int,vector<int>,less<int> > l;
priority_queue<int,vector<int>,greater<int> > r;
char s[444];
int main()
{
	int i,j,k;
	int n;

	while (scanf("%s",s)!=EOF)
	{
		if (isdigit(s[0]))
		{
			k=atof(s);
			if (l.empty() || k<=r.top())
				l.push(k);
			else if (k>=r.top())
				r.push(k);
		}
		else
		{
			printf("%d\n",r.top());
			r.pop();
		}
		
		while (l.size()>r.size())
		{
			r.push(l.top());
			l.pop();
		}
		
		while (l.size()+1<r.size())
		{
			l.push(r.top());
			r.pop();
		}
	}
	
	
}

再貼自己沒有過的程式碼。

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<ctype.h>

using namespace std;

#define N 600010
char s[23];

int small[N],big[N];
int nsmall,nbig;
void insert_small(int k)
{
	small[++nsmall]=k;
	int cur=nsmall;
	int father=cur>>1;
	while (father>=1)
	{
		if (small[cur]>small[father])
		{
			swap(small[father],small[cur]);
			cur=father;
			father=cur>>1;
		}
		else
  			break;
	}	
}

void insert_big(int k)
{
	big[++nbig]=k;
	int cur=nbig;
	int father=cur>>1;
	while (father)
	{
		if (big[father]>big[cur])
		{
			swap(big[father],big[cur]);
			cur=father;
			father=cur>>1;
		}
		else
			break;
	}
}

void pop_small()
{
	small[1]=small[nsmall--];
	int cur=1;
	int child=cur<<1;
	while (child<=nsmall)
	{
		if (child+1<nsmall &&  small[child]<small[child+1])
			child++;
		if (small[child]>small[cur])
		{
			swap(small[child],small[cur]);
			cur=child;
			child<<=1;
		}
		else
			break;
	}
}

void pop_big()
{
	big[1]=big[nbig--];
	int cur=1;
	int child=cur<<1;
	while (child<=nbig)
	{
		if (child<nbig && big[child+1]<big[child])
			child++;
		if (big[child]<big[cur])
		{
			swap(big[child],big[cur]);
			cur=child;
			child<<=1;
		}
		else
			break;
	}
}

int main()
{
	freopen("in.txt","r",stdin);
	int i,j,k;
	big[0]=0;
	small[0]=0;
	nsmall=nbig=0;
	while (scanf("%s",s)!=EOF)
	{
		
		if (isdigit(s[0]))
		{
			k=atof(s);
			//cout<<' '<<nsmall<<' '<<nbig<<endl;
			if (nsmall<1 || k<=big[1])
				insert_small(k);
			else if (k>big[1])
				insert_big(k);
		}
		else
		{
			printf("%d\n",big[1]);
			pop_big();
		}
		//cout<<nsmall<<' '<<nbig<<endl;
		
		while (nsmall>nbig )
		{
			insert_big(small[1]);
			pop_small();
		}
		while (nbig>nsmall+1 )
		{
			insert_small(big[1]);
			pop_big();
		}
	//	cout<<nsmall<<' '<<nbig<<endl;

	}

	return 0;
}


Cookies Test

Time Limit: 3000 ms Memory Limit: 65535 kB Solved: 53 Tried: 196

Submit

Status

Best Solution

Back

Description

As chief programmer at a cookie production plant you have many responsibilities, one of them being that the cookies produced and packaged at the plant adhere to the very demanding quality standards of the Nordic Cookie Packaging Consortium (NCPC).

At any given time, your production line is producing new cookies which are stored in a holding area, awaiting packaging. From time to time there are also requests from the packaging unit to send a cookie from the holding area to be packaged. Naturally, you have programmed the system so that there are never any packaging requests sent if the holding area is empty. What complicates the matter is the fact that representatives of the NCPC might make a surprise inspection to check that your cookies are up to standard. Such an inspection consists of the NCPC representatives demanding that the next few cookies sent to the packaging unit instead be handed over to them; if they are convinced that these cookies look (and taste) the same, you pass the inspection, otherwise you fail.

Fortunately, the production plant has invested in a new measurement thingamajig capable of measuring cookie diameters with a precision of 1 nanometre (nm). Since you do not have the time to always be on the lookout for cookie craving NCPC inspectors, you have decided that a sensible strategy to cope with the inspections is to always send a cookie having the median diameter among all cookies currently in the holding area to the packaging unit on a request. If there is no cookie exhibiting the median diameter in the holding area, you instead send the smallest cookie larger than the median to the packaging unit, hoping it will please the NCPC inspectors. This means that, if the cookies were sorted in order of ascending diameter, and if there was an odd number c of cookies in the holding area, you would send the cookie at position (c + 1)/2 in the sorted sequence, while if there was an even number c of cookies in the holding area, you would send the cookie at position (c/2) + 1 in the sorted sequence to the packaging unit on a request.

Input

Each line of the input contains either a positive integer d, indicating that a freshly baked cookie with diameter d nm has arrived at the holding area, or the symbol ’#’, indicating a request from the packaging unit to send a cookie for packaging. There are at most 600 000 lines of input, and you may assume that the holding area is empty when the ?rst cookie in the input arrives to the holding area. Furthermore, you have read somewhere that the cookie oven at the plant cannot produce cookies that have a diameter larger than 30 centimetres (cm) (or 300 000 000 nm).

Output

A sequence of lines, each indicating the diameter in nm of a cookie sent for packaging, in the same order as they are sent.

Sample Input

1
2
3
4
#
#
#
#

Sample Output

3
2
4
1



相關推薦

煎餅

雖然不喜歡吃這個煎餅 題意:給出一列數列,隨時求其中位數並刪除。。 思路:用兩個堆,,左邊一個堆,,右邊一個堆,並維持其個數差不超過1.              一開始自己寫的堆,,自己測試的資料也是對我,就是一直WA,,            後來改用priori

關於構建二維動態內存及釋放

動態內存 size alloc spa pre all class ++ for 分配一維的內存堆可以直接用malloc及free,關於二維有如下方法: a=(int**)malloc(sizeof(int*)*m); for(i=0;i<m;i

深入淺出數據結構C語言版15——優先隊列

turn github png 操作 pri 整數 過程 不難 nbsp   在普通隊列中,元素出隊的順序是由元素入隊時間決定的,也就是誰先入隊,誰先出隊。但是有時候我們希望有這樣的一個隊列:誰先入隊不重要,重要的是誰的“優先級高”,優先級越高越先出隊。這樣的數據結構我們稱

ADT - heap

str com define 合並 iostream color 進行 建堆 nbsp 二叉堆:   以前寫過二叉堆,但很少使用,快忘了。最近又查了一些關於堆的資料,於是重新熟悉一下這種數據結構。   一個快速又簡單的方式建立二叉堆,僅使用簡單vector(或者數組也行

最小函數值

輸入 之一 getch ont 我們 描述 a* algorithm int 最小函數值 題目描述 有n個函數,分別為F1,F2,...,Fn。定義Fi(x)=Aix^2+Bix+Ci (x∈N*)。給定這些Ai、Bi和Ci,請求出所有函數的所有函數值中最小的m個(如有重復

P1484 種樹

cyrcyr今天在種樹,他在一條直線上挖了n個坑。這n個坑都可以種樹,但為了保證每一棵樹都有充足的養料,cyrcyr不會在相鄰的兩個坑中種樹。而且由於cyrcyr的樹種不夠,他至多會種k棵樹。假設cyrcyr有某種神能力,能預知自己在某個坑種樹的獲利會是多少(可能為負),請你幫助他計算出他的

2018.12.05 codeforces 948C. Producing Snow

傳送門 維護一個堆。 每次先算出一個都不彈掉的總貢獻。 然後把要彈掉的彈掉,並減去它們對應的貢獻。 程式碼: #include<bits/stdc++.h> #define ri register int using namespace std; typedef long

JVM02----垃圾收集上

Java中最大的特點在於具備良好的垃圾收集器。GC是JAVA中最重要的安全保證。 整個JVM中的GC的處理機制:對不需要的物件進行標記,而後進行清除。 一. 堆記憶體劃分                   &nb

少說話多寫程式碼之Python學習059——標準模組

heap堆是一種優先佇列,用優先佇列可以以任意順序增加物件。並且在任何時間找到最小元素。Python中有一個包含一些堆操作函式的模組heapq。包括如下函式, heappush(heap,x) 將x入堆 heappop(heap) 將堆中最小的元素彈出 heapify(heap) 將heap屬性

2018.10.01【校內模擬】購買書籍貪心set實現

描述 L的書籍被M偷了以後傷心欲絕,決定再購買一些回來,現在有 N 本書可以買,每本書的價格是 a[i]元。 現在L總共有 M 元,以及 K 張優惠券。 對於每本書,如果使用一張優惠券,則可以用b[i]的優惠價格購買。 注意每本書只能使用一張優惠券,只能購買一次

C++ 如何限制一個類物件只在棧上建立

1 概述 昨天一個同學去網易面試C++研發,問到了這麼一個問題:如何限制一個類物件只在棧(堆)上分配空間? 一般情況下,編寫一個類,是可以在棧或者堆分配空間。但有些時候,你想編寫一個只能在棧或者只能在堆上面分配空間的類。這能不能實現呢?仔細想想,其實也是可以滴。 在

優先佇列

優先佇列和普通佇列的區別在於,優先佇列(堆)總是先優先處理佇列中最小的元素。 優先佇列(堆)允許至少下列兩種操作:Insert(插入),以及DeleteMin(刪除最小者),他的工作是找出、返回和刪除優先佇列中的最小元素。Insert操作類似於Enqueue(入隊),而DeleteMin則是佇列中Deque

PAT 備考——優先佇列排序

一、堆 堆是完全二叉樹型中的一種的資料結構,按照排列順序分為大頂堆和小頂堆。其中大頂堆表示二叉樹中所有根節點比子節點大,小頂堆反之。 因此,以大頂堆為例,堆具有如下兩個性質: 有序性:從根節點到任意子節點的路徑,所經過的節點是有序排列的; 完全性:與完全二叉樹相同,當用陣

如何讓類物件只在棧上分配空間?

一般情況下,編寫一個類,是可以在棧或者堆分配空間。但有些時候,你想編寫一個只能在棧或者只能在堆上面分配空間的類。這能不能實現呢?仔細想想,其實也是可以滴。 在C++中,類的物件建立分為兩種,一種是靜態建立,如A a;另一種是動態建立,如A* ptr=new A

第6章 優先佇列

優先佇列 優先佇列資料結構屬於電腦科學中最精緻的一種 6.1 模型 優先佇列允許至少兩種操作:插入和刪除最小者 6.2 一些簡單的實現 優先佇列的插入和刪除最小者的最壞情形時間均為o(logN),但插入操作實際上將花費平均時間,若無刪除操作的干擾,該結構的實現將以線性時間建

Priority Queue(Heaps)--優先佇列

0)引論 前面已經有了連結串列,堆疊,佇列,樹等資料結構,尤其是樹,是一個很強大的資料結構,能做很多事情,那麼為什麼還要引進一個優先佇列的東東呢?它和佇列有什麼本質的不同呢?看一個例子,有一個印表機,但是有很多的檔案需要列印,那麼這些任務必然要排隊等候印表機逐步的處理。這裡

優先佇列淺談

1、概述 在分析堆之前,你可以理解一下佇列和棧,其實他們都是對任務的一種排程策略,只是各自的準則不同罷了,佇列為先進先出,棧為先進後出,而堆是每個任務分配了一個優先權,根據優先權進行任務的執行。排程程式通過堆始終能獲取優先權最高的任務進行執行。比較常見應用為作業系統。 2、

優先佇列及相關操作

二叉堆(堆) 堆是一顆完全二叉樹:除了底層每個節點都有兩個孩子,底層節點從左到右依次填入(不能有間隔)。 一顆高為hh的完全二叉樹有2h∼2h+1−12h∼2h+1−1個節點;NN的節點的完全二叉樹的高度為⌊logN⌋⌊log⁡N⌋。 堆可以用陣列實現:如果

java資料結構和演算法10

  這篇我們說說堆這種資料結構,其實到這裡就暫時把java的資料結構告一段落,感覺說的也差不多了,各種常見的資料結構都說到了,其實還有一種資料結構是“圖”,然而暫時對圖沒啥興趣,等有興趣的再說;還有排序演算法,emmm....有時間再看看吧!   其實從寫資料結構開始到現在讓我最大的感觸就是:新手剛開始還是不

Java學習筆記——排序算法之進階排序排序與分治並歸排序

進行 技術分享 ring http 沒有 oid 有序 重復 調整 春蠶到死絲方盡,蠟炬成灰淚始幹               ——無題 這裏介紹兩個比較難的算法: 1、堆排序 2、分治並歸排序 先說堆。 這裏請大家先自行了解完全二叉樹的數據結構。 堆是完全二叉樹。