提高代码的速度效率

时间:2017-07-13 11:24:38

标签: c performance optimization

// author- squeamishossifrage
#include <stdio.h>

int main() {
    int k, t, A, N, B, max, num_tests;
    scanf("%d", &num_tests);
    while (num_tests--) {
        scanf("%d %d", &N, &B);
        A = 1;
        k = N / B;
        for (k=N/B,max=0; k>0; k--) {
            t = (N-k*B) * k;
            if (t > max) max = t;
        }
        printf("%d\n", max);
    }
    return 0;
}

上面的代码(取自this answer)似乎需要一秒多一点,但约束是在一秒钟内执行。如何在不使用多线程的情况下提高此类代码的速度(我不知道如何使用它们)?

2 个答案:

答案 0 :(得分:1)

这应该可以解决问题:

#include <stdio.h>

int main() {
    int k, N, B, max, num_tests;
    scanf("%d", &num_tests);
    while (num_tests--) {
        scanf("%d %d", &N, &B);
        k = (double)N / (2*B)+0.5;
        max = (N-k*B)*k;
        printf("%d\n", max);
    }
    return 0;
}

没有循环应该更有效率。这个概念是以代数方式解决问题,然后适当地解决。

最大k

t = N*k - k²*B

可以通过区分为k来找到:

k = N/(2*B)

必须适当地舍入,然后插入原始等式

t = (N-k*B) * k;

这是正确的(最大)解决方案。

答案 1 :(得分:0)

函数:printf()和函数:scanf()非常“重载”并占用很多CPU周期。

强烈建议使用getchar_unlocked()putchar_unlocked()因为它们的速度要快得多。

这里有两个I / O函数,比printf()scanf()快一点注意size_t而不是int的使用

#include <stdio.h>

void fastRead( size_t *a );
void fastWrite( size_t a );

inline void fastRead(size_t *a)
{
    int c=0;
    // note: 32 is space character
    while (c<33) c=getchar_unlocked();

    // initialize result value
    *a=0;

    // punctuation parens, etc are show stoppers
    while (c>47 && c<58)
    {
        *a = (*a)*10 + (size_t)(c-48);
        c=getchar_unlocked();
    }
    //printf( "%s, value: %lu\n", __func__, *a );
} // end function: fastRead


inline void fastWrite(size_t a)
{
    char snum[20];
    //printf( "%s, %lu\n", __func__, a );

    int i=0;
    do
    {
        // 48 is numeric character 0
        snum[i++] = (char)((a%10)+(size_t)48);
        a=a/10;
    }while(a>0);

    i=i-1; // correction for overincrement from prior 'while' loop

    while(i>=0)
    {
        putchar_unlocked(snum[i--]);
    }
    putchar_unlocked('\n');
} // end function: fastWrite