这道题,是 ACM-ICPC World Finals Marrakech的比赛题中的第一题,题目挺简单的,给了你公式。题目要我们求解的是数组中的最大差值,也就是 Max{a[i] - a[j]}其中(i < j)。
用暴力的方法也是超时,尽管时间限制是5S,所以需要用线性时间的算法。
下面的是AC的代码:
#include <iostream>
#include <cmath>
#include <cstdio>
using namespace std;
const int MAXN = 1000005;
int p, a, b, c, d, n;
double price[MAXN];
int main()
{
int i, j;
while(scanf("%d%d%d%d%d%d", &p, &a, &b, &c, &d, &n) != EOF)
{
for(i = 1; i <= n; i++) //按照公式计算
price[i] = p * (sin(a * i + b) + cos(c * i + d) + 2);
if(n >= 2) //n>2的情况
{
double Max = price[1] - price[2], temp = price[1];
for(i = 3; i <= n; i++)
{
if(price[i - 1] > temp) //找到数组中相对大的数,这里的相对就是要差值最大,而不一定要找到数组中最大的
temp = price[i - 1];
if(temp - price[i] > Max) //找差值最大的
Max = temp - price[i];
}
if(Max >= 0)
printf("%lf\n", Max);
else //小于0,也就是数组递增的,输出0
{
Max = 0.0;
printf("%lf\n", Max);
}
}
else //n = 1特殊处理
{
double Max = 0.0;
printf("%lf\n", Max);
}
}
return 0;
}