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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章