题目大意:
现有一个离散函数定义在整数1, 2, 3, ...., N上(2 ≤ N ≤ 100,000),函数值范围为__int64,现求这样两个点的横坐标,这两个点之间的点都低于两点连线,并且这两个点之间的倾斜度最大,就只有一个测例,给定N以及各点的函数值。
注释代码:
/*
* Problem ID : URAL 1517 Freedom of Choice
* Author : Lirx.t.Una
* Language : Visual C++ 2010
* Run Time : 0.046
* Run Memory : 920 KB
*/
#include <stdio.h>
#include <math.h>
//最大的离散点数
#define MAXN 100001
typedef long long llg;
//function,保存函数值,按照题目要求是从下标1开始的
llg f[MAXN];
int
main() {
int n;//点数
int p;//position,最终答案点的横坐标(第二个点)
int i;
double k;//两点之间的斜率(这里要求是倾斜度),因此取绝对值,斜率值可能超出__int64的范围
double mk;//maximum k,记录当前最大的倾斜度
double tmp;
scanf("%d", &n);
for ( i = 1; i <= n; i++ )
scanf("%lld", f + i);
//可以证明,最大倾斜度一定出现在相邻两点
//反证法:如果最大倾斜度的两点之间隔着一个点,
//即如果k13 > k12和k23的话则中间的点2一定高于13两点之间的连线了,所以这里逐个枚举相邻两点
for ( mk = -0.1, i = 2; i <= n; i++ ) {
k = (double)f[i] - (double)f[i - 1];
if ( ( tmp = fabs(k) ) > mk ) {
mk = tmp;
p = i;
}
}
printf("%d %d\n", p - 1, p);
return 0;
}
无注释代码:
#include <stdio.h>
#include <math.h>
#define MAXN 100001
typedef long long llg;
llg f[MAXN];
int
main() {
int n;
int p;
int i;
double k;
double mk;
double tmp;
scanf("%d", &n);
for ( i = 1; i <= n; i++ )
scanf("%lld", f + i);
for ( mk = -0.1, i = 2; i <= n; i++ ) {
k = (double)f[i] - (double)f[i - 1];
if ( ( tmp = fabs(k) ) > mk ) {
mk = tmp;
p = i;
}
}
printf("%d %d\n", p - 1, p);
return 0;
}
单词解释:
dicrete:adj, 离散的
argument:n, 参数
inclination:n, 斜率,斜坡
abscissa:n, 横坐标
ambiguity:n, 含糊,不明确