B - Fractions Again?!
It is easy to see that for every fraction in the form 1k(k > 0), we can always find two positive integersx and y, x ≥ y, such that:
1/k=1/x+1/y
Now our question is: can you write a program that counts how many such pairs of x and y thereare for any given k?
Input
Input contains no more than 100 lines, each giving a value of k (0 < k ≤ 10000).
Output
For each k, output the number of corresponding (x, y) pairs, followed by a sorted list of the values ofx and y, as shown in the sample output.
Sample Input
2
12
Sample Output
2
1/2 = 1/6 + 1/3
1/2 = 1/4 + 1/4
8
1/12 = 1/156 + 1/13
1/12 = 1/84 + 1/14
1/12 = 1/60 + 1/15
1/12 = 1/48 + 1/16
1/12 = 1/36 + 1/18
1/12 = 1/30 + 1/20
1/12 = 1/28 + 1/21
1/12 = 1/24 + 1/24
先放源代码:
#include <cstdio>
using namespace std;
int main()
{
int x, y, num1, num2, sign;
double k, num;
int x1[1000], y1[1000];
while(scanf("%lf", &k) != EOF)
{
num1 = 2 * k;
num2 = k + 1;
sign = 0;
for(y = num2; y <= num1; y++)
{
num = 0;
for(x = num1; num < k; x++)
{
num = (double)(x * y) / (double)(x + y);
if(num == k)
{
x1[sign] = x;
y1[sign] = y;
sign++;
break;
}
}
}
printf("%d\n", sign);
for(int i = 0; i < sign; i++)
printf("1/%.lf = 1/%d + 1/%d\n", k, x1[i], y1[i]);
}
return 0;
}
结果超时,明显超时处就是两个for循环,所以做出以下改进:
将对x的循环改为:
if((k * y) % (y - k) == 0 && (k * y) / (y - k) >= y)
{
;
}
;
}
for循环改成判断,减少时间,就可以通过了。
总结:
即使是暴力算法,也要尽可能找出减少计算时间的地方。
C - Maximum Product
&
E - To the Max
这两个同样用的是动态规划,C是基础版,E是进阶版。
C的关键处就是这个:
for(int i = 0;i < n;i++)
{
if(Sum > 0)
{
Sum += a[i];
}
else
{
Sum = a[i];
}
if(Sum > Max)
{
Max = curSum;
}
}
可以不用两个for循环就能找出每个以a[i]开头的最大值。
D也是这个道理,不过需要分别使用横向和纵向的两个函数。