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

相关推荐
UIU1146 小时前
P1233 [ICPC 2001 Taejon R] 木棍加工
数据结构·c++·算法·动态规划
论文复现现场6 小时前
WRF、FEA 能用 L40S 加速吗?求解器检查、断点恢复与长期运行
java·数据库·算法·wrf·有限元分析·gpu计算·断点续算
ZhengEnCi6 小时前
用 AI 写代码为什么拼到最后还是拼人:算力瓶颈与领域专家提示词的本质差异
算法·架构
秋天的怀念_David7 小时前
第二十一夜 · 数字黑洞与西西弗斯的惩罚
java·程序人生·算法
碧海银沙音频科技研究院8 小时前
在PC电脑上用Whisper→Marian算法实现离线语音翻译功能
算法·whisper
niyongsheng8 小时前
3D 装箱算法工程化:数据结构、放置启发式与支撑规则
数据结构·算法·rust
j7~11 小时前
【穷举、深搜与回溯算法】一棵决策树讲透全排列与子集
数据结构·c++·算法·leetcode·回溯·递归
傅科摆 _ py12 小时前
DP,贪心,堆和栈,二分力扣复习
开发语言·python·算法
Shaoshing12 小时前
LeetCode100 42.接雨水
java·算法·leetcode
域限奇点访客13 小时前
用AI生成问卷的网站怎么选?看题目录入结构、题型映射和生成后的校验
算法