• CodeForces 1332D


    题意:

    构造一个矩阵,使得从左上角到右下角实际的最大值比题目提供的 (dp) 方法大 (k)

    分析:

    使得 (dp) 所求出的最大值为 (0),实际最大值为 (k)
    对于矩阵:

    [ left[ egin{matrix} a_{1,1} & a_{1,2} \ a_{2,1} & a_{2,2} end{matrix} ight] ]

    按照题目给的 (dp) 的做法,
    (a_{2,2}=max{a_{1,1}&a_{1,2}&a_{2,2} , a_{1,1}&a_{2,1}&a_{2,2}})
    构造矩阵:

    [ left[ egin{matrix} x igoplus k & x \ k & x igoplus k end{matrix} ight] ]

    有:(a_{2,2}=max{(x igoplus k)&x,(x igoplus k)&k })
    又因为有:((x igoplus k)&x &k=0)
    在原有矩阵的基础上进行修改:

    [ left[ egin{matrix} x igoplus k & x & 0\ k & x igoplus k & k end{matrix} ight] ]

    所以我们要使的 ((x igoplus k)&x > (x igoplus k)&k),才能保证按 (dp) 做法求出的结果为 (0)
    那么 (x) 的取值就很关键。(x) 应该取比 (k_{max}) 大且为 (2) 的整数次幂,如 (2^{17})
    所以 (dp) 取得的最大值为 ((x igoplus k)&x &k=0)
    实际最大值为 ((x^k)&k=k)
    最终矩阵为:

    [ left[ egin{matrix} 2^{17} igoplus k & 2^{17} & 0\ k & 2^{17} igoplus k & k end{matrix} ight] ]

    代码:

    C++:

    #include <bits/stdc++.h>
    using namespace std;
    int main()
    {
        int k;
        scanf("%d",&k);
        printf("2 3
    ");
        int x=1<<17;
        printf("%d %d %d
    ",x^k,x,0);
        printf("%d %d %d
    ",k,x^k,k);
        return 0;
    }
    

    python:

    k=int(input())
    print("2 3
    ")
    x=1<<17
    print(x^k,x,0)
    print(k,x^k,k)
    
  • 相关阅读:
    从0开始搭建Element项目
    Git的上传步骤
    从JVM的角度解析String
    两个字符串相加究竟发生了什么
    简单工厂搭配策略模式
    java返回集合为null还是空集合
    idea常用快捷键
    (7)Stream简介
    (6)函数式接口的简单使用
    (4)函数式接口
  • 原文地址:https://www.cnblogs.com/1024-xzx/p/12637820.html
Copyright © 2020-2023  润新知