какая трудоемкая конструкция в следующей программе? - PullRequest
2 голосов
/ 12 марта 2011

при отправке решения для практической задачи 6 (странно) я получил ошибку TLE, но при использовании print и scanf вместо cin и cout мой sol был успешно отправлен со временем 0,77 ... я хочу знать, как я могу это сделатьболее эффективная
ссылка на проблему - проблема кодефа 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 ]

3 голосов
/ 12 марта 2011

Ответ - это наибольшая сила 2 <= n. </p>

Я использовал следующую функцию от восхищения хакеров, чтобы решить эту проблему:

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 голос
/ 12 марта 2011

Ну, вам действительно нужно найти наибольшую степень на два меньше, чем заданное число.Итак, вы можете попробовать следующее.

scanf("%ld,&given_number);
dummy=1;
while(dummy < given_number) {
     dummy*=2;
}
printf("%ld",dummy/2);
0 голосов
/ 12 марта 2011
inline unsigned int floorpow2(unsigned int x)
{
    for( unsigned int y; (y = x & (x-1)); )
        x = y;

    return x;
}
0 голосов
/ 12 марта 2011

Интересно, тестер тоже включает время компиляции?

$ 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 ++ - измы и использовал #include <stdio.h>, и версия C компилируется менее чем за половину времени версии C ++.

На моей относительно ненормальной машине (Core i7) время выполнения обоих занимает около 1,7 секунды, когда вывод поступает на терминал, и 0,05 секунды, когда вывод поступает в файл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...