杂项


汉诺塔问题

#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;
}

文章作者: Cedeat
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Cedeat !
  目录