URAL 1010 Discrete Function

题目大意:

        现有一个离散函数定义在整数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, 含糊,不明确

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值