牛客寒假算法训练营4

A(签到)

B(前缀和)

C(构造、位运算、格雷码、分治)

题意 构造一个排列 2^n的排列使得相邻两项的异或和最小

我们要让相邻两个数组的不同位尽可能小 也就是尽可能一位不同而且这个位越小越好

最终构造的排列就是格雷码

也可以直接暴力

遍历每个数字 i 从小到大对每一位j位都异或(1<<j) 得到数字num 如果num没有出现过 那么就是这个数

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int main(){
    int n;
    cin >> n;
    for(int i = 0; i < 1 << n; i++){
        cout << (i ^ (i >> 1)) << " ";
    }
    cout << endl;
}

F(构造)

要保证mex尽可能大

构造方式就是,将多的字符平均分成少的字符数量+1 块,然后在块与块之间填数。

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int main() {
    int T = 1;
    cin >> T;
    while (T--) {
        int a, b;
        cin >> a >> b;
        string t;
        if (a == b) {
            for (int i = 1; i <= a; i++) {
                t += "10";
            }
        } else {
            char c0 = '0', c1 = '1';
            if (a < b) {
                swap(a, b);
                swap(c0, c1);
            }
            int x = a / (b + 1);
            int k = a % (b + 1);
            for (int i = 1; i <= b + 1; i++) {
                t += string(x + (k > 0), c0);
                if (k > 0) k -= 1;
                t += c1;
            }
            t.pop_back();
        }
        cout << t << endl;
    }
}
    

G(构造)

如果数字中有 0,那很显然至多变化一次就结束了。

如果数字中有 1,实际上不会对答案造成任何影响。

如果数字中有5 ,那么它后续变化中一定都有 ,且数位中一旦出现偶数,就会变 0,导致快速结 束。

如果数字中有 4、6、8、9 ,实际上它们对乘积的贡献等价于 2*2,2*3,2*2*2,3*3。

因此实际上一个数我们只需要看它有几个因子 2、3、7 即可,我们可以枚举这三个因子的个数,然后暴 力检验变化的次数。 最后将这些因子组成数字即可,为了让数字位数最少,就是3个 2变成一个8 ,每2个3 变成一个9 ,多出来的 2和3 组成2 、3、4、6 ,所有的7 都单独作为一个数字。

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int main() {
    cout << "27777789999999999 277777788888899" << endl;
}

H(模拟)

代码

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=505;
int s[N][N];
int n,m,q;
int dx[15]={0,0,0,0,-2,-1,-1,-1,1,1,1,2};
int dy[15]={-2,-1,1,2,0,-1,0,1,-1,0,1,0};
int sum[N][N];
signed main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin>>n>>m>>q;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cin>>s[i][j];
        }
    }
    int maxval=-1;
    int xa=1,ya=1;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            sum[i][j]+=s[i][j];
            for(int k=0;k<12;k++){
                int ux=i+dx[k];
                int uy=j+dy[k];
                if(ux<=n&&uy<=m&&ux>=1&&uy>=1){
                    sum[i][j]+=s[ux][uy];
                }
            }
            if(sum[i][j]>maxval){
                    maxval=sum[i][j];
                    xa=i;ya=j;
            }
        }
    }
    while(q--){
        int x,y,z;
        cin>>x>>y>>z;
        s[x][y]+=z;
        sum[x][y]+=z;
        if(sum[x][y]>maxval){
            maxval=sum[x][y];
            xa=x;ya=y;
        }
        for(int k=0;k<12;k++){
            int ux=x+dx[k];
            int uy=y+dy[k];
            if(ux<=n&&uy<=m&&ux>=1&&uy>=1){
                sum[ux][uy]+=z;
                if(sum[ux][uy]>maxval){
                    maxval=sum[ux][uy];
                    xa=ux;ya=uy;
                }
            }
            
        }
        cout<<xa<<' '<<ya<<'\n';
    }

    return 0;
}

I(概率期望 可以猜一下 签到)

相关推荐
编程小白_澄映1 小时前
《机器学习》——KNN算法
人工智能·算法·机器学习
小O的算法实验室1 小时前
2026年IEEE TAI,基于代理辅助双层优化的多次访问协同卡车-无人机路径规划,深度解析+性能实测
算法·论文复现·智能算法·智能算法改进
瑞熙贝通实验室综合管理平台1 小时前
科研生物样本存储中心系统一站式整体解决方案
人工智能·算法
ghie90901 小时前
蚁群全局最优算法:原理、改进与MATLAB实现
开发语言·算法·matlab
甄心爱学习2 小时前
【LR逻辑回归】原理以及tensorflow实现
算法·tensorflow·逻辑回归
踢足球09292 小时前
寒假打卡:2026-2-24
数据结构·算法·leetcode
有为少年2 小时前
位翻转排列 (Bit-Reversal Permutation) 解析
数据结构·人工智能·深度学习·算法·机器学习·计算机视觉
寻寻觅觅☆2 小时前
东华OJ-基础题-133-FJ的字符串(C++)
算法
乌萨奇也要立志学C++2 小时前
动态规划 线性 DP 经典四题一遍吃透
算法·动态规划