新的聯合容器,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