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