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

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

1057. Stack (30)

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

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;}
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 大理市| 汽车| 普兰县| 靖宇县| 神木县| 松江区| 祁门县| 长岛县| 东宁县| 奈曼旗| 新民市| 疏勒县| 乐陵市| 宁城县| 清苑县| 定结县| 清河县| 东阿县| 镇康县| 德惠市| 左权县| 广灵县| 海伦市| 车险| 南陵县| 富顺县| 同德县| 怀柔区| 惠安县| 九江县| 林州市| 青阳县| 乐安县| 肃宁县| 汉源县| 漳州市| 公安县| 镇坪县| 怀来县| 临安市| 新丰县|