当前位置: 首页 > 知识库问答 >
问题:

用有限的位数找到最大的奇数

阙沛
2023-03-14

我试图解决这个问题,但自动法官返回“超过时限”(TLE)。

情人节之际,亚当和夏娃继续参加比赛。他们通过了所有的回合,进入了决赛。在最后一轮中,亚当得到一个偶数N和一个整数K,他必须找到最大的奇数M小于N,使得M的二进制表示中的数字之和最大为K。

输入格式:

对于每个测试用例,您都会得到一个偶数N和一个整数K

输出格式

对于每个测试用例,输出整数M(如果存在),否则打印-1

限制条件:

>

  • 1≤T≤104

    2.≤ N≤ 109

    0≤K≤30

    示例输入:

    2  
    10 2  
    6 1 
    

    样本输出:

    9 
    1
    

    这是我到目前为止所做的。

        static long play(long n, int k){
          if(k==0) return -1;
          if(k==1) return 1;
          long m=n-1;      
          while(m>0){                      
                  long value=Long.bitCount(m); //built in function to count bits
                  if(value<=k ){                  
                      return m;
                  }
                  m=m-2;          
          }     
            return -1;
        }
    
        public void solve(InputReader in, OutputWriter out) {
           long start=System.currentTimeMillis(); 
           int t=in.readInt();
           while(t-->0){                
              long n=in.readLong();         
              int k=in.readInt();
              long result=play(n,k);         
              out.printLine(result);
           }
           long end=System.currentTimeMillis();
           out.printLine((end-start)/1000d+"ms");       
        } 
     }       
    
  • 共有3个答案

    宋腾
    2023-03-14

    因为答案很奇怪,

    让ans=1,这里我们使用1位,所以k=k-1;

    现在ans的二进制表示是

    ans(binary) = 00000000000000000000000000000001
    
    while(k > 0):
    
         make 30th position set
         ans(binary) = 01000000000000000000000000000001
         if(ans(decimal) < N):
              k -= 1
         else:
              reset 30th position
              ans(binary) = 00000000000000000000000000000001
     Do the same from 29th to 1st position
    
    宓跃
    2023-03-14

    您必须执行按位运算来快速计算答案。让我给你一些提示。

    数字1在二进制和十进制表示法中是相同的:12=110

    要使数字102=210,请将1向左移动一个位置。在Java和许多其他语言中,我们可以这样写:

    (1 << 1) == 2
    

    要使二进制数1002=410,请将1向左移动两个位置:

    (1 << 2) == 4
    

    要使二进制数10002=810向左移动1三个位置:

    (1 << 3) == 8
    

    你明白了。

    要查看某个位置的位是1还是0,请使用

    5 & (1 << 2) != 0
    5 & (1 << 1) == 0
    5 & (1 << 0) != 0
    

    要将位设置为0,请使用按位异或运算符^。例如,我们可以将710=1112的第二有效位设置为0,从而获得510=1012

    7 ^ (1 << 1) == 5
    

    商松
    2023-03-14

    根据更新的问题N可以在2到10^9之间。从N-1开始循环2次,然后循环10^9/2次。不好的。

    M=N-1开始是好的。使用bitCount(M)是很好的开始。如果初始位计数为

    但如果不是,请不要循环执行步骤-2

    看到你脑海中的数字是二进制的,例如110101011。位计数为6。假设K是4,这意味着你必须删除2位。最右边的位必须保持在,并且你想要最大的数,所以清除两个倒数第二个1位。结果:110100001

    现在,你想想怎么写。并在不转换为文本的情况下进行。

    注:带N

     类似资料:
    • 本文向大家介绍在C ++中找到偶数和奇数位数的数字总和,包括了在C ++中找到偶数和奇数位数的数字总和的使用技巧和注意事项,需要的朋友参考一下 假设我们有一个整数N,我们必须找到奇数位和偶数位的和。因此,如果数字是153654,则odd_sum = 9,even_sum = 15。 为了解决这个问题,我们可以从最后一位提取所有数字,如果原始数字的位数是奇数,则最后一位必须是奇数位,否则将是偶数位。

    • 一、题目 输入数字n,按顺序打印出从1到n位最大十进数的数值。比如输入3,则打印出1、2、3一直到最大三位数即999。 二、解题思路 ①使用一个n位的数组来存储每一位的元素。例如n位3,则000表示为[0,0,0]。 使用递归的方式,存放每一位元素值。 ②同上,使用一个n位的数组来存储每一位的元素。然后循环执行加1运算,并在数组中进行模拟进位,直到最高位需要进位,则表示循环结束。 三、解题代码 p

    • 题目描述 输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数即 999。 解题思路 由于 n 可能会非常大,因此不能直接用 int 表示数字,而是用 char 数组进行存储。 使用回溯法得到所有的数。 // java public void print1ToMaxOfNDigits(int n) { if (n <= 0)

    • 问题内容: 我想知道如何解决这个问题(这不是学校的东西,我是业余爱好,我正在做欧拉的练习)。我的代码中的问题是:char c = great.charAt(i); 我想知道如何在great.charAt(i)中看到下一个i。我发布了代码,在此先感谢您的帮助。 问题答案: 查看程序的输出,我看到它具有如下所示的块: 这说明,对于五个数字的子序列,您实际上只是将其中一个数字乘以五倍。 您需要确保迭代该

    • 给定一个非负整数数组,设计最简单的算法来找到最大大小的子数组,并将其加到最小的值。 我的想法是,因为它们是非负整数,所以和最小的数组总是单个单元数组,只有原始数组的最小值。如果我理解正确的话,它取决于什么具有更高的优先级,具有更高的长度或更小的值。然而,这个问题从来没有明确说明哪一个优先。 我在这个问题上是正确的,还是我遗漏了什么?

    • 问题内容: 有什么简单的方法或功能可以确定python列表中的最大数量?我只可以编写代码,因为我只有三个数字,但是如果我可以使用内置函数或类似的东西告诉最大的代码,那么它将使代码的冗余度降低很多。 问题答案: 关于什么