牛客寒假算法训练营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(概率期望 可以猜一下 签到)

相关推荐
故事和你911 天前
sdut-程序设计基础Ⅰ-实验五一维数组(8-13)
开发语言·数据结构·c++·算法·蓝桥杯·图论·类和对象
像污秽一样1 天前
算法与设计与分析-习题4.2
算法·排序算法·深度优先·dfs·bfs
Storynone1 天前
【Day20】LeetCode:39. 组合总和,40. 组合总和II,131. 分割回文串
python·算法·leetcode
明明如月学长1 天前
AI 更新太快学不过来?我用OpenClaw打造专属AI学习工作流
算法
黎阳之光1 天前
【黎阳之光:以无线专网与视频孪生,赋能智慧广电与数字中国】
算法·安全·智慧城市·数字孪生
刀法如飞1 天前
Agentic AI时代,程序员必备的算法思想指南
人工智能·算法·agent
刀法如飞1 天前
Agentic AI时代程序员必备算法思想详解(附实战案例)
算法·ai编程·编程开发·agentic
飞Link1 天前
告别盲目找Bug:深度解析 TSTD 异常检测中的预测模型(Python 实战版)
开发语言·python·算法·bug
记忆多1 天前
c++名字空间 函数模版 左右值
开发语言·c++·算法
三伏5221 天前
控制理论前置知识——相平面数学基础2(示例部分)
算法·平面·控制