分糖果

描述
有n个小孩排队问你要糖果,每个小孩都有一个可爱值。你必须给每个小孩至少一个糖果,而且可爱值高的小孩拿的糖果必须比相邻的小孩要多。 
注意:如果相邻两人的可爱值相同,则没有限制。 
问你总共最少得准备多少糖果。 

比如有5个小孩,他们的可爱值分别为3,40,2,1,10. 
那么最少的方案应该是1,3,2,1,2,总数为的9
 
关于输入
第一行一个正整数,n,表示小孩的数量。(n<=100000) 第二行n个正整数,第i整数表示第i个小孩的可爱值(在int范围内)。数之间用一个空格隔开。
 
关于输出
一个正整数,最少要准备的糖果数。
 
例子输入
5

3 40 2 1 10

例子输出
9


#include <stdio.h>
#include <stdlib.h>

int main()
{
	int n = 0, j;
	int *p = 0, *q = 0;
	int t = 0;

	scanf("%d", &n);
	p = (int *)calloc(n, sizeof(int));
	q = (int *)calloc(n, sizeof(int));
	for (j = 0; j < n; j++)
	{
		scanf("%d", &p[j]);
	}

	q[0] = 1;
	for (j = 1; j < n; j++)
	{
		if (p[j] <= p[j - 1])
			q[j] = 1;
		else
			q[j] = q[j - 1] + 1;
	}
	for (j = n - 2; j >= 0; j--)
	{
		if (p[j] > p[j + 1] && q[j] <= q[j + 1])
			q[j] = q[j + 1] + 1;
	}

	for (j = 0; j < n; ++j)
	{
		t += q[j];
	}
	printf("\n%d\n", t);
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值