• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
jacklee404
Never Stop!
博客园    首页    新随笔    联系   管理    订阅  订阅
L2-041 插松枝

题目传送门
可以把动作抽象为函数,然后维护这个函数,使其操作合法,发现可以节省好多代码,相当于把自己想象成一个系统来处理事件,使事件的操作都合法。

#include <iostream>
#include <cstring>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <algorithm>
#include <functional>
#include <utility>
#include <unordered_set>
#include <unordered_map>
#define INF 0x3f3f3f3f
#define siz(x) (int)x.size()
#define IOS ios::sync_with_stdio(false);
#define rep(i, j, k) for(int i = j; i <= k; ++ i)
#define per(i, j, k) for(int i = j; i >= k; -- i)
#define dbg1(a) cout << a << endl;
#define dbg2(a, b) cout << a << " " <<  b << endl;
#define dbg3(a, b, c) cout << a << " " << b << " " << c << endl;
#define pb(x) push_back(x)
#define eb(x) emplace_back(x)
#define all(x) x.begin(), x.end()
#define f first
#define s second
#define lc p<<1
#define rc p<<1|1
using namespace std;
typedef long long LL;
typedef priority_queue<int, vector<int>, greater<int>> S_HEAP;
typedef priority_queue<int> B_HEAP; 
typedef pair<string, int> PSI;
typedef pair<int, int> PII;
const int N = 1e5 + 10;

/*
	step
	1. 取盒子中的,盒子没有取推送器
	2. 保证树枝非递增,盒子不满足取推送器,推送器不满足,放到盒子里面继续取
	3. 下面情况停止
		1. 盒子满了,推送器不满足,放回推送器
		2. 盒子不满足,推送器也没了
		3. 松枝已经插满
	n 推送器含多少个, m 小盒子最多放多少个, k 一根松枝干最多插多少个
	停止条件:
		盒子空 推送器空
*/

int n, m, k;

vector<int> a, b, now;

bool pushA(int x) {
	if (siz(a) + 1 <= m) {
		a.pb(x);
		return true;
	}
	return false;
}

bool push() {
	// if (siz(now) == k) {
	// 	cout << siz(a) << " " << siz(b) << endl;
	// }
	if (siz(now) == k || (!siz(a) && !siz(b))) return false;

	if (!siz(now)) {
		if (siz(a)) now.pb(a.back()), a.pop_back();
		else now.pb(b.back()), b.pop_back();
	}

	// 盒子的东西不能放的时候
	if (!siz(a) || (a.back() > now.back())) {
		// 当推送器不为空,且仍不满足,接着推
		while (siz(b) && b.back() > now.back()) {
			if (!pushA(b.back())) {
				return false;
			} else {
				b.pop_back();
			}
		}
		if (!siz(b)) {
			return false;
		} else {
			// cout << "?" << endl;
			now.pb(b.back()), b.pop_back();
		}
		// cout << "?" << endl;
	} else {
		// 盒子的东西可以放
		now.pb(a.back()), a.pop_back();
	}
	return true;
}

void out() {
	for (int i = 0; i < siz(now); i ++) {
		cout << now[i];
		if (i != siz(now) - 1) cout << " ";
	}
	cout << "\n";
	now.clear();
}

int main() {
	cin >> n >> m >> k;
	rep (i, 1, n) {
		int t;
		cin >> t, b.pb(t);
	}
	reverse(b.begin(), b.end());
	while (siz(a) || siz(b)) {
		if (!push()) {
			out();
		}
	}
	if (siz(now)) {
		out();
	}
}
posted on 2022-12-19 21:27  Jack404  阅读(180)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3