河南萌新联赛2024第(四)场:河南理工大学

A

思路:

B

思路:有一种贪心的写法,将整个数组排序以后比较两个相邻数的同或值,取 m a x max max,不会证明

int th(int x, int y, int z) {
    int res = 0;
    for (int i = z - 1; i >= 0; i --) {
        int dx = (x >> i & 1);
        int dy = (y >> i & 1);
        if (dx == dy) res = res * 2 + 1;
        else res = res * 2;
    }
    return res;
}


void solve() {
    int n, m; cin >> n >> m;
    vector<int> a(n);
    for (int i = 0; i < n; i ++) {
        cin >> a[i];
    }
    sort(a.rbegin(), a.rend());
    int ans = 0;
    for (int i = 1; i < n; i ++) {
        ans = max(ans, th(a[i], a[i - 1], m));
    }
    cout << ans << '\n';
}

思路:字典树的写法,和最大异或对的差不多

int tr[N][2], vis[N][2];
int n, m, idx;

void insert(int x) {
    int p = 0;
    for (int i = m - 1; i >= 0; i --) {
        int u = (x >> i & 1);
        if (!tr[p][u]) tr[p][u] = ++idx;
        p = tr[p][u];
    }
}

int queyr(int x) {
    int p = 0, res = 0;
    for (int i = m - 1; i >= 0; i --) {
        int u = (x >> i & 1);
        if (tr[p][u]) res = res * 2 + 1, p = tr[p][u];
        else res = res * 2, p = tr[p][u ^ 1];
    }
    return res;
}

void solve() {
    cin >> n >> m;
    int ans = 0;
    for (int i = 0, x; i < n; i ++) {
        cin >> x;
        ans = max(ans, queyr(x));
        insert(x);
    }
    cout << ans << '\n';
}

C

思路:

D

思路:直接根号判断素数即可

void solve() {
	int x; cin >> x;
	if (!judge(x)) cout << "No\n";
	else cout << "Yes\n";
}

E

思路:

F

思路:

G

思路:模拟模拟

void solve() {
    string s; cin >> s;
    vector<int> a;
    int sum = 0, res = 0;
    for (int i = 0; i < s.size(); i ++) {
        if (s[i] >= '0' && s[i] <= '9') {
            res = res * 10 + (s[i] - '0');
        } else {
            a.push_back(res);
            res = 0;
        }
    }
    if (res) a.push_back(res);
    sort(a.rbegin(), a.rend());
    cout << a[0];
    sum += a[0];
    for (int i = 1; i < a.size(); i ++) {
        cout << '+' << a[i];
        sum += a[i];
    }
    cout << '\n';
    cout << sum << '\n';
}

H

思路:我肯定要拿最多,要尽量让一半的人拿 1 1 1,奇数偶数讨论一下

void solve() {
    int n, x; cin >> x >> n;
    int t;
    if (n & 1) t = n / 2;
    else t = n / 2 - 1;
    cout << x - t << '\n';
}

I

思路:

J

思路:

K

思路:

L

思路:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值