// 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)似乎需要一秒多一点,但约束是在一秒钟内执行。如何在不使用多线程的情况下提高此类代码的速度(我不知道如何使用它们)?
答案 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