以下程序中耗时的构造?

时间:2011-03-12 07:39:59

标签: c++ algorithm

在提交练习题6(奇数)的解决方案时,我收到了TLE错误 虽然使用print和scanf到位cin和cout我的sol已成功提交0.77s时间..我想知道如何让它更有效率
问题链接是codechef problem 6

#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
    int n,N;
    scanf("%d",&n);
    for(int l=0;l<n;l++)
    {
        scanf("%d",&N); 
        int i=0,x; 
        if(N<=0)
        continue; 
        for(;N>=(x=(2<<i));i++);
        printf("%d",x/2); 
        cout<<"\n";
    }
}

4 个答案:

答案 0 :(得分:3)

答案实际上是2&lt; = n。

的最大功率

我使用黑客高兴的以下功能来解决这个问题:

unsigned int pow2 (unsigned int x){

        x = x | (x >> 1);
        x = x | (x >> 2);
        x = x | (x >> 4);
        x = x | (x >> 8);
        x = x | (x >> 16);

        return x - (x >> 1);
}

并在0.75秒内被接受。

我想知道什么比这更快。我可以看到0秒的一些提交!!

答案 1 :(得分:1)

嗯,你真的必须找到比给定数字少两个的最大功率。 所以,你可以试试以下内容。

scanf("%ld,&given_number);
dummy=1;
while(dummy < given_number) {
     dummy*=2;
}
printf("%ld",dummy/2);

答案 2 :(得分:0)

我想知道测试人员是否也包括编译时间?

$ time gcc -std=c99 -o time time.c
real        0m0.082s
user        0m0.040s
sys 0m0.020s

$ time g++ -o time time.c++
real        0m0.210s
user        0m0.160s
sys 0m0.030s

对于C99版本,我只是删除了C ++ - isms并使用了#include <stdio.h>,而C版本的编译时间不到C ++版本的一半。

在我相对疯狂的机器(Core i7)上,当输出到终端时,两者的运行时间大约需要1.7秒,输出到文件时需要0.05秒。

答案 3 :(得分:0)

inline unsigned int floorpow2(unsigned int x)
{
    for( unsigned int y; (y = x & (x-1)); )
        x = y;

    return x;
}