AI大战原神

· · 科技·工程

deepseek 做 genshin oi round 1。

获得了 100+60+15+100=275 的高分。

第一题简单构造不在话下。

第二题 AI 居然识破了概率不是 1 就是 0,但是在实现时遗憾只获得了 60 分。

第三题 AI 似乎没有发现答案是叶子个数,而是通过正常的期望算法做题,不知道怎么RE了。只在 m=0 时正确。

第四题 AI 居然会 1-\dfrac{6}{\pi^2} 实在是太牛了。

附四道题 AI 代码:

#include <iostream>
#include <vector>

using namespace std;

int main() {
    int n;
    cin >> n;
    vector<int> c(n);
    long long sum = 0;
    for (int i = 0; i < n; ++i) {
        cin >> c[i];
        sum += c[i];
    }
    if (sum % n != 0) {
        cout << -1 << endl;
        return 0;
    }
    if (n % 2 == 0) {
        cout << -1 << endl;
        return 0;
    }
    vector<int> a(n), b(n);
    for (int i = 0; i < n; ++i) {
        a[i] = (n - c[i]) % n;
        b[i] = (2 * c[i]) % n;
    }
    for (int i = 0; i < n; ++i) {
        cout << a[i] << (i == n-1 ? "\n" : " ");
    }
    for (int i = 0; i < n; ++i) {
        cout << b[i] << (i == n-1 ? "\n" : " ");
    }
    return 0;
}
#include <bits/stdc++.h>
using namespace std;

vector<int> bfs(int n, const vector<vector<int>>& adj, int start) {
    vector<int> d(n + 1, -1);
    queue<int> q;
    q.push(start);
    d[start] = 0;
    while (!q.empty()) {
        int u = q.front();
        q.pop();
        for (int v : adj[u]) {
            if (d[v] == -1) {
                d[v] = d[u] + 1;
                q.push(v);
            }
        }
    }
    return d;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int T;
    cin >> T;
    while (T--) {
        int n, m;
        cin >> n >> m;
        vector<vector<int>> adj(n + 1);
        for (int i = 0; i < m; ++i) {
            int u, v;
            cin >> u >> v;
            adj[u].push_back(v);
            adj[v].push_back(u);
        }

        vector<int> d = bfs(n, adj, 1);

        vector<vector<int>> parents(n + 1);
        for (int u = 1; u <= n; ++u) {
            if (d[u] == -1) continue;
            for (int v : adj[u]) {
                if (d[v] == d[u] - 1) {
                    parents[u].push_back(v);
                }
            }
        }

        bool valid = true;
        for (int u = 1; u <= n && valid; ++u) {
            if (d[u] <= 0) continue; // skip node 1 and unreachable nodes
            for (int p : parents[u]) {
                for (int v : adj[p]) {
                    if (d[p] == -1) continue;
                    if (d[v] == d[p] - 1) continue; // v is parent of p
                    if (d[v] >= d[p] + 1) continue;
                    valid = false;
                    break;
                }
                if (!valid) break;
            }
        }

        if (valid) {
            cout << "1.000\n";
        } else {
            cout << "0.000\n";
        }
    }

    return 0;
}
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int MOD = 998244353;
const int N = 2e5 + 10;
int inv[N];

struct Tree {
    vector<int> parent;
    vector<unordered_set<int>> children;
    int root;
    ll sum;
    int n;

    Tree(int size) : parent(size + 1), children(size + 1), root(1), sum(0), n(size) {
        for (int i = 1; i <= size; ++i) {
            children[i] = unordered_set<int>();
        }
        parent[1] = 0;
        for (int i = 2; i <= size; ++i) {
            int f;
            cin >> f;
            parent[i] = f;
            children[f].insert(i);
        }
        for (int u = 1; u <= size; ++u) {
            if (children[u].size() > 0) {
                sum = (sum + (children[u].size() - 1)) % MOD;
            }
        }
    }

    void add(int u, int v) {
        children[u].insert(v);
        parent[v] = u;
        int c = children[u].size();
        if (c == 1) {
            sum = (sum + 0) % MOD;
        } else {
            sum = (sum + 1) % MOD;
        }
    }

    void del(int u) {
        int p = parent[u];
        children[p].erase(u);
        int c = children[p].size();
        if (c == 0) {
            sum = (sum - (children[p].size() + 1 - 1)) % MOD;
        } else {
            sum = (sum - 1) % MOD;
        }
    }

    void upd(int new_root) {
        root = new_root;
    }

    ll get_ans() {
        return (1 + sum + MOD) % MOD;
    }
};

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);

    int n;
    cin >> n;
    Tree tree(n);

    cout << tree.get_ans() << '\n';

    int m;
    cin >> m;
    int added = 0;
    for (int i = 0; i < m; ++i) {
        string op;
        int u;
        cin >> op >> u;
        if (op == "Add") {
            added++;
            int v = n + added;
            tree.add(u, v);
        } else if (op == "Del") {
            tree.del(u);
        } else if (op == "Upd") {
            tree.upd(u);
        }
        cout << tree.get_ans() << '\n';
    }

    return 0;
}
#include <iostream>
#include <cmath>

using namespace std;

const long double PI = 3.141592653589793238462643383279502884L;

long long compute(long long n) {
    long double ratio = 6.0L / (PI * PI);
    long double res = n * (1.0L - ratio);
    return static_cast<long long>(res + 0.5L); // 四舍五入到最近的整数
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int T;
    cin >> T;
    while (T--) {
        long long n;
        cin >> n;
        cout << compute(n) << '\n';
    }

    return 0;
}