题目传送门
可以把动作抽象为函数,然后维护这个函数,使其操作合法,发现可以节省好多代码,相当于把自己想象成一个系统来处理事件,使事件的操作都合法。
#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();
}
}
浙公网安备 33010602011771号