C 需要帮助解决这个涉及硬币翻转的编程问题吗
我正在尝试解决codechef.com()上的硬币翻转问题 我的代码是C语言的,我在运行Linux的机器上使用gcc v4.4.3对其进行了测试,我的程序适用于提供的示例输入。然而,在上传给法官时,我得到了“错误答案”的信息。 在我的程序中,我通过位的切换来表示硬币的翻转。我认为我的算法是正确的,我不能想出一个失败的例子。下面是我的代码。 任何帮助都将不胜感激 多谢各位C 需要帮助解决这个涉及硬币翻转的编程问题吗,c,algorithm,C,Algorithm,我正在尝试解决codechef.com()上的硬币翻转问题 我的代码是C语言的,我在运行Linux的机器上使用gcc v4.4.3对其进行了测试,我的程序适用于提供的示例输入。然而,在上传给法官时,我得到了“错误答案”的信息。 在我的程序中,我通过位的切换来表示硬币的翻转。我认为我的算法是正确的,我不能想出一个失败的例子。下面是我的代码。 任何帮助都将不胜感激 多谢各位 #include <stdio.h> long int n=0,temp,number_of_coins,num
#include <stdio.h>
long int n=0,temp,number_of_coins,number_of_inputs,bit_mask;
long int number_of_ones(long int i) //Return the number of bits set
{
return __builtin_popcountl(i);
}
int main(void)
{
long int ctr,lower,upper,length;
int op;
scanf("%ld %ld",&number_of_coins,&number_of_inputs);
length = number_of_coins-1;
for(ctr = 0 ; ctr < number_of_inputs;ctr++) //Main loop
{
scanf("%d %ld %ld",&op,&lower,&upper);
bit_mask = ((1 << length-lower+1)-1) & ~((1 << length-upper)-1);
if(op == 0)
{
n ^= bit_mask ; //Toggle the bits in the range lower to upper
}
else
{
temp = n;
temp &= bit_mask;
printf("%ld\n",number_of_ones(temp)); //Print number of bits set
}
}
return 0;
}
#包括
长整数n=0,温度,硬币数,输入数,位掩码;
long int number_of_one(long int i)//返回设置的位数
{
返回内置的popcountl(i);
}
内部主(空)
{
长内中心,下部,上部,长度;
int op;
scanf(“%ld%ld”、”硬币数量“、”输入数量“);
长度=硬币的数量-1;
对于(ctr=0;ctr<输入的数量;ctr++)//主循环
{
scanf(“%d%ld%ld”、&op、&lower和&lower);
位掩码=((1检查结果的CodeChef方法可能有问题,因为我也得到了相同的答案。您的代码没有问题。检查结果的CodeChef方法可能有问题,因为我也得到了相同的答案。您的代码没有问题。存储在long int
中的位序列表示硬币,您的代码不能处理超过32个硬币(或long
中的位数)但是,该网站规定最多可以有100000枚硬币。由于您使用存储在长整数中的位序列来表示硬币,因此您的代码不能处理超过32枚硬币(或者长整数中的位数是多少)但是,该网站规定最多可以有100000个硬币。该网站是否希望您的程序在打印输出之前一次获取所有输入行?您认为名为\uuuu builtin\u popcountl
的函数是可移植的?我认为情况并非如此,因为我以前提交过一些解决方案,但我没有提交事先获取所有输入。程序应该从输入流读取并写入输出流@Borealid:在线法官使用的是gcc v4.3.2。这会导致问题吗?网站是否可能希望您的程序在打印输出之前一次获取所有输入行?您认为名为\u的函数是内置的_popcountl
是可移植的吗?我认为情况并非如此,因为我以前提交过一些解决方案,但我没有事先获取所有输入。该程序应该从输入流读取数据并写入输出流@Borealid:online judge使用的是gcc v4.3.2。这会导致问题吗?这是正确的。您可以跟踪10000 bi手动输入并占用大量内存,或者您可以使用间隔的链接列表。@mathepic:“或者您可以使用间隔的链接列表”…对于010101010101这样的序列,我会占用大量的内存。这是一个很好的观点,但我认为链表平均占用的内存会更少…不太确定。谢谢你的回答。请有人解释一下,我如何使用从索引0到索引99999的间隔的链表来表示以下3个步骤1)位被翻转2)然后从索引400到索引500的位被翻转3)最后,从索引4到索引10的位被翻转。这是正确的。您可以手动跟踪10000位并占用大量内存,或者您可以使用间隔的链接列表。@mathepic:“或者您可以使用间隔的链接列表”…对于010101010101这样的序列,我会占用大量的内存。这是一个很好的观点,但我认为链表平均占用的内存会更少…不太确定。谢谢你的回答。请有人解释一下,我如何使用一个间隔为1)从索引0到索引99999的位被翻转2)然后位的链表来表示以下3个步骤从索引400到索引500被翻转3)最后,从索引4到索引10的位被翻转。