我试图解决codechef.com上的硬币翻转问题(http://www.codechef.com/problems/FLIPCOIN/
我的代码是用c编写的,我在运行linux的机器上使用gcc v4.4.3对它进行了测试,我的程序为提供的示例输入工作。然而,在上传给法官时,我得到的信息是“错误的答案”。
在我的程序中,我用比特的切换来表示硬币的翻转,我认为我的算法是正确的,我无法想出一个失败的例子。下面是我的代码。
任何帮助都将不胜感激。
谢谢您。

#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;

}

最佳答案

因为您使用存储在long int中的位序列来表示硬币,所以您的代码不能处理超过32个硬币(或者不管long中有多少位)该网站规定,虽然可能有多达10万枚硬币。

关于c - 在涉及抛硬币的编程问题上需要帮助,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3539485/

10-12 21:09