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

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

1057. Stack (30)

2019-11-10 19:21:08
字體:
來源:轉載
供稿:網友

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

2. 思路:

題意:題目關鍵是求棧的中位數。思路:一般方法會超時。必須是O(1)或者O(log)求中位數才不會??梢杂脴錉顢到M,或者用集合模擬大小堆。我用的是集合(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;}
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 邢台县| 舒城县| 雅安市| 巴中市| 汤原县| 北安市| 张掖市| 红安县| 三穗县| 大同市| 个旧市| 永宁县| 大厂| 东乡族自治县| 郑州市| 堆龙德庆县| 昌图县| 平安县| 商城县| 邯郸县| 保定市| 阳西县| 叶城县| 外汇| 莒南县| 陇川县| 玉溪市| 临泽县| 红桥区| 迁西县| 潼关县| 小金县| 红原县| 绩溪县| 沙河市| 舞阳县| 萍乡市| 太康县| 双桥区| 普定县| 容城县|