在提交练习题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";
}
}
答案 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;
}