PIPIOJ 1330 PIPI的樂高積木 (STL:set)

新的聯合容器,set。

一.set(集合)

  • 元素默認從小到大排序。
  • 遍歷需要迭代器,效率較序列容器低。
  • 其實現爲樹,不能用[]訪問。
  • 所有內容不可修改。

二.set常用操作

s.begin()
s.end() 
s.clear()
s.empty()
s.insert()//插入一個元素
s.erase()//刪除一個元素,參數既可以是迭代器也可以是值
s.size()
s.find()//查找一個元素,如果容器中不存在該元素,返回值等於s.end()

三.思路波動過程
雖然看過一次課了,但對set印象不深,忘了(滑稽)。遂想用vector作,放入pair, first爲高度,sencond爲id。重新定義排序方法,所有輸入完成後對vecor進行sort排序。寫完函數後想到,每次交換後都需要重新排一次序,豈不要麻煩死,放棄,直接回看視頻。回看視頻發現按照之前的思路做下去確實是不行的,sort函數的時間複雜度是nlogn,進行k次移動的時間複雜度爲k*nlogn,時間超限。

set容器內容不可修改,只能刪除再重新插入,這種思路學習一波。

//操作很方便
s.erase(it);//注意
s.erase(s.begin());
s.insert({ h1 + 1,id1 });
s.insert({ h2 - 1,id2 });

此外發現erase函數可放入迭代器指針,上網搜索發現確實沒錯,即可用指針也可用實際值。

	int ans = k;//提交後答案錯誤,卡住
	set<Bar>::iterator it;
	for (int i = 1; i <= k; i++) {
		it = s.end();
		if (it != s.begin())it--;
		int h1 = (*s.begin()).h, h2 = (*it).h;
		int id1 = (*s.begin()).id, id2 = (*it).id;
		if (h2 - h1 < 2) {
			ans = i - 1;
			break;
		}
		s.erase(*it);
		s.erase(*s.begin());
		s.insert({ h1 + 1,id1 });
		s.insert({ h2 - 1,id2 });
		vec.push_back({ id2,id1 });
	}

開始時ans初始化爲0,忽略了交換k次的情況,答案錯誤,卡了我好長時間。

  • 2020/1/28
  • 2020/2/19
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章