汉诺塔问题
#include <bits/stdc++.h>
using namespace std;
void move(int n, char a, char b)
{
cout << "No." << n << ' ' << "disk: " << a << "->" << b << endl;
}
void hanoi (int n, char a, char b, char c)
{
if (n == 1){
move(n, a, c);
}
else{
hanoi(n - 1, a, c, b); // 将a上面n - 1个盘子借助c移到b
move(n, a, c);// 将最后一个n号盘子从a移动到c
hanoi(n - 1, b, a, c); // 将b上的n - 1个盘子借助a移到c上
}
}
int main()
{
int n;
cin >> n;
hanoi(n, 'a', 'b', 'c');
}
约瑟夫环
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1001000;
int tt;
int n, k;
int q[maxn];
void solve()
{
cin >> n >> k;
q[1] = 0;
for (int i = 2; i <= n; i++)
{
q[i] = (q[i - 1] + k) % i;
}
cout << q[n] + 1 << endl;
}
signed main()
{
solve();
return 0;
}
对顶堆动态维护中位数
将前半部分元素push进大根堆,后半部分元素push进小根堆,再每次维护两堆的大小,需保证两堆中的元素差不大于一,每次查询中位数时
1.如果元素总数为偶数,中位数即为两堆顶的平均数。
2.否则,中位数即为两堆中元素较多的堆顶。
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstdio>
#include <cstring>
#include <vector>
#include <cstdio>
#include <string>
#include <map>
#include <queue>
#include <cmath>
using namespace std;
#define pb push_back
#define all(x) x.begin(), x.end()
#define int long long
#define endl '\n'
#define x first
#define y second
typedef double db;
typedef pair<int, int> PII;
const int maxn = 200010;
const int inf = 0x3f3f3f3f;
const int mod = 100000007;
int gcd(int a, int b) {return b ? gcd(b, a % b) : a;}
int lcm(int a, int b) {return a / gcd(a, b) * b;}
//int h[maxn], ne[maxn], e[maxn], w[maxn], idx;
int tt;
int n, m, k;
int q[maxn];
void solve() {
cin >> n;
for (int i = 1; i <= n; i ++ ) cin >> q[i];
priority_queue<int> bg;
priority_queue<int, vector<int>, greater<int>> ss;
//bg.push(q[1]);
int mid = q[1];
cout << mid << endl;
for (int i = 2; i <= n; i ++ ) {
if (q[i] > mid) ss.push(q[i]);
else bg.push(q[i]);
if (i & 1) {
while (bg.size() != ss.size()) {
if (bg.size() > ss.size()) {
ss.push(mid);
mid = bg.top();
bg.pop();
}
else {
bg.push(mid);
mid = ss.top();
ss.pop();
}
}
cout << mid << endl;
}
}
}
signed main() {
cin.tie(nullptr), cout.tie(nullptr);
ios::sync_with_stdio(false);
tt = 1;
//cin >> tt;
while (tt -- )
solve();
return 0;
}