C++某oj题:按位与 的思路及解法?

C++关于此题http://39.99.183.126:8888/p/JGYJ003的思路及代码?
注意:

img

枚举TLE!
AI复制粘贴别来烦人

img


数据范围10^18

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这篇博客: 算法竞赛C++常用技巧——输入输出优化(防止TLE)中的 代码实现 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    递归版

    void write(int x) {
      if (x < 0) {  // 判负 + 输出负号 + 变原数为正数
        x = -x;
        putchar('-');
      }
      if (x > 9) write(x / 10);  // 递归,将除最后一位外的其他部分放到递归中输出
      putchar(x % 10 + '0');  // 已经输出(递归)完 x 末位前的所有数字,输出末位
    }
    

    由于递归的任务量比较大,我们可以利用栈来实现非递归。

    非递归版

    inline void write(int x) {
      static int sta[35];
      int top = 0;
      do {
        sta[top++] = x % 10, x /= 10;//将取出的元素入栈。
      } while (x);
      while (top) putchar(sta[--top] + 48);  //由于我们要输出字符,这里进行转换: 48 是 '0'
    }
    

    OK,这就是经典的输入输出的优化做法,通常cf榜上的大佬用的都是后面这种方法,这确实很快,比scanf和printf快了约1/31/31/3了吧。我自己常用的就是第一种优化方法,通常我会利用宏定义来避免这么繁琐,如:#define IOS ios::sync_with_stdio(false);cin.tie(0); cout.tie(0)

    那么,在主函数直接使用IOS;语句即可实现优化功能。

  • 以下回答来自chatgpt:

    根据问题的要求,题目的思路及代码如下:

    思路: - 题目要求找出两个数组的最长公共上升子序列的长度。 - 首先,通过读取输入的两个数组,保存到数组a和b中。 - 然后,使用二维数组f[N][N]来保存以a[i]和b[j]结尾的最长公共上升子序列的长度。 - 遍历a数组和b数组,更新二维数组f。 - 如果a[i]和b[j]相等,则f[i][j]等于1加上前面所有比b[j]小的数的最大长度。 - 否则,f[i][j]等于前面所有比b[j]小的数加1的最大长度。 - 最后,找到f数组中的最大值,即为最长公共上升子序列的长度。

    代码如下:

    #include<bits/stdc++.h>
    using namespace std;
    const int N=3010;
    int a[N], b[N], f[N][N];
    
    int main()
    {
        int n, ans = 0;
        scanf("%d", &n);
        for(int i = 1; i <= n; i++) scanf("%d", &a[i]);
        for(int i = 1; i <= n; i++) scanf("%d", &b[i]);
    
        for(int i = 1; i <= n; i++) {
            for(int j = 1; j <= n; j++) {
                f[i][j] = f[i-1][j];
                if(a[i] == b[j]) {
                    f[i][j] = max(f[i][j], 1);
                    for(int k = 1; k < j; k++) {
                        if(b[k] < b[j]) {
                            f[i][j] = max(f[i][j], f[i][k] + 1);
                        }
                    }
                }
            }
        }
    
        for(int i = 1; i <= n; i++) {
            ans = max(ans, f[n][i]);
        }
    
        printf("%d\n", ans);
        return 0;
    }
    

    以上就是按位与的题目的思路及代码。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

你发的这个地址需要登录啊。把题目贴出来吧

img