我试图解决这个问题,但自动法官返回“超过时限”(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");
}
}
因为答案很奇怪,
让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
您必须执行按位运算来快速计算答案。让我给你一些提示。
数字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
根据更新的问题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列表中的最大数量?我只可以编写代码,因为我只有三个数字,但是如果我可以使用内置函数或类似的东西告诉最大的代码,那么它将使代码的冗余度降低很多。 问题答案: 关于什么