csp 公共钥匙盒 vector等stl容器的嵌套 find函数sort函数

csp解题记录

公共钥匙盒 vector的嵌套解法

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
vector<int> pos;
class event
{
	public:
		bool get_or_ret = 1;
		// 1为还钥匙,0为取钥匙
		int key=0;
		// 哪一把钥匙
		event(int k, bool flag)
		{
			key = k;
			get_or_ret = flag;
		}
};

vector<pair<int, event> > event_data;

void init(int n)
{
	for(int i=1;i<=n;i++)
	{
		pos.push_back(i);
	}
}
void get(int k)
{
	//cout <<k<< "get!" << endl;
	*find(pos.begin(), pos.end(), k)=0;
}
void ret(int k)
{
	//cout << k << "return!" << endl;
	*find(pos.begin(), pos.end(), 0) = k;
}
bool cmp1(pair<int, event> a, pair<int, event> b)
{
	return a.first < b.first;
	// 按时间顺序排列
}
bool cmp2(pair<int, event> a, pair<int, event> b)
{
	return a.second.key < b.second.key;
	// 按钥匙顺序决定先后顺序
}
void show1(vector<int> p)
{
	for (int i = 0; i < p.size(); i++)
	{
		cout << p[i] << " ";
	}
}
void show2(vector<pair<int,event>> p)
{
	for (int i = 0; i < p.size(); i++)
	{
		cout << p[i].first<< " "<<p[i].second.key<<" "<<p[i].second.get_or_ret << endl;
	}
}
int main()
{
	int n, k;
	cin >> n >> k;
	init(n);
	//初始化钥匙的位置
	int w, s, c;
	while (k--)
	{
		cin >> w >> s >> c;
		event_data.push_back(make_pair(s, event(w, 0)));
		event_data.push_back(make_pair(s+c, event(w, 1)));
		// have put in
	}
	sort(event_data.begin(), event_data.end(), cmp1);
	// sort time 
	k = event_data.size();
	for (int i = 0; i < k; i++)
	{
		if (i == k - 1 ||event_data[i].first != event_data[i + 1].first)
		{
			if (event_data[i].second.get_or_ret)
			{
				ret(event_data[i].second.key);
			}
			else
			{
				get(event_data[i].second.key);
			}
		}
		else//进行多任务重合情况
		{
			int p = i;
			while (p != k - 1 && event_data[p].first == event_data[p + 1].first)
			{
				p++;
			}
			//从i到p都是一样的了
			sort(event_data.begin() + i, event_data.begin() + p+1, cmp2);
			// 注意,sort函数一定是开头从第一个开始,结尾从end()结尾,及end()是空位
			// 如果写成sort(event_data.begin() + i, event_data.begin() + p, cmp2);
			// 则最后一位漏掉了
			for (int k = i; k <=p; k++)
			{
				if (event_data[k].second.get_or_ret)
				{
					ret(event_data[k].second.key);
				}
			}
			for (int k = i; k <= p; k++)
			{
				if (!event_data[k].second.get_or_ret )
				{
					get(event_data[k].second.key);
				}
			}
			// 两遍循环,达到先归还后拿的顺序
			i = p;
		}
	}

	
	show1(pos);

	return 0;
}

需要注意的就是泛算法,sort,find在vector容器中的使用
sort 可以通过定义比较顺序cmp函数来进行改变
find在vector的查找有两种方式:
1.
单独的value查询,如int,char(这些都是已经封装好“==”的重载的类了),此时可以直接find(begin(),end(),value)进行查询
2.
vector使用了嵌套,如果是保存的自定义类,应该对自定义类进行重载:

bool operator == (const Test& testobj) const
	{
		//如果a相等,则判断为相等
		//return a == testobj.a;
		//如果a和b都相等,则判断为相等
		return (a == testobj.a) && (b == testobj.b);
	}
  1. 如果使用了pair<> 作为vector的嵌套,目前我还没找到好的查找办法,应该是直接重载stl::find函数
  2. 如果使用了map,set等容器,将会自动根据key值排序
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值