国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

1057. Stack (30)

2019-11-10 18:50:53
字體:
來源:轉載
供稿:網友

1. 原題: https://www.patest.cn/contests/pat-a-PRactise/1057

2. 思路:

題意:題目關鍵是求棧的中位數。思路:一般方法會超時。必須是O(1)或者O(log)求中位數才不會。可以用樹狀數組,或者用集合模擬大小堆。我用的是集合(multiset).一個small(小根堆),保存后一半。big(大根堆),保存前一半元素。大根堆與小根堆的元素個數相等(偶數),或者多1個(奇數),這樣大根堆堆頂即是中位數。已AC。部分參考自:http://blog.csdn.net/kakitgogogo/article/details/51926600

3. 源碼(已AC):

#include<iostream>#include<stack>#include<vector>#include<set>#include<functional>//使用仿函數greater<int>using namespace std;int main(void){	//freopen("in.txt", "r", stdin);	int N;	char s[15];	stack<int> st;	multiset<int> small;//小根堆	multiset<int, greater<int> > big;//大根堆	scanf("%d", &N);	for (int i = 0; i < N; i++)	{		scanf("%s", s);		if (s[1] == 'o')		{			if (st.empty())				printf("Invalid/n");			else			{				int num = st.top();				printf("%d/n", num);				if (num > *big.begin())					small.erase(small.find(num));//刪除不能用值做參數,會刪除多個。				else					big.erase(big.find(num));				st.pop();			}		}		else if (s[1] == 'u')		{			int num;			scanf("%d", &num);			st.push(num);			if (!big.empty() && num > *big.begin())				small.insert(num);			else				big.insert(num);		}		else		{			if (big.empty())				printf("Invalid/n");			else				printf("%d/n", *big.begin());		}		if (small.size() > big.size())//對兩個堆進行維護,確保符合要求。		{			big.insert(*small.begin());			small.erase(small.begin());		}		else if (big.size() > small.size() + 1)		{			small.insert(*big.begin());			big.erase(big.begin());		}	}	return 0;}
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 巧家县| 桦甸市| 灯塔市| 双鸭山市| 奉新县| 南昌县| 北海市| 嵩明县| 湘西| 灌云县| 张北县| 恭城| 延庆县| 吉安市| 汉中市| 内丘县| 辽宁省| 商丘市| 蓬安县| 中卫市| 灵丘县| 新邵县| 古蔺县| 北票市| 华阴市| 蒙自县| 古丈县| 龙游县| 娄烦县| 揭阳市| 荣成市| 肇源县| 莫力| 中牟县| 张北县| 固镇县| 珠海市| 武夷山市| 泸溪县| 黎川县| 龙泉市|