北京林业大学校赛-C题(Candy)

题目链接点击打开链接


这是一道类似于贪心的题目,题目要求如果一个儿童比周围儿童的rating高的话,那么他得到的糖果数应该比周围的高,但是最后让我们求最小的总糖果数!!


那么我们从左往右的顺序想,,找相邻的,首先令第一个为糖果数为1,后面的扫描中,如果当前儿童比左边儿童rating高,那么当前儿童的糖果数就是左边儿童糖果数加1,仅仅加1,,满足从左到右的顺序是最小的。。。这个时候,我们要需要满足从右到左的顺序满足,我们令最后一个为1,从右往左扫描,,如果当前儿童rating比他右边相邻的rating高,再判断一下当前儿童的糖果数与右边儿童糖果数+1比较,谁大取谁,,因为你俩边都得满足条件,才是合理的,所以谁大取谁!!


#include <cstdio>
#include <cstring>
#include <string>
#include <iostream>
#include <algorithm>
#include <stack>
#include <queue>                      
#include <map>
#include <vector>
#include <cmath>
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1                                  
using namespace std;
const int maxn = 55555;
struct node
{
	int ca, va;
	node(){}
	node(int va,int ca):va(va),ca(ca){}
}node1[333];

int main(void)
{
	//freopen("in.txt", "r", stdin);
	int n;

	while (scanf("%d", &n) != EOF)
	{
		int i;
		for (i = 0; i < n; i++)
		{
			int va;
			scanf("%d", &va);
			node1[i] = node(va, 1);							//先初始化全部为1
		}
		for (i = 1; i < n; i++)
		{
			if (node1[i].va > node1[i - 1].va)
				node1[i].ca = node1[i - 1].ca + 1;
		}
		int total = node1[n-1].ca;
		for (i = n - 2; i >= 0; i--)
		{
			if (node1[i].va > node1[i + 1].va&&node1[i].ca < node1[i + 1].ca + 1)    //谁大取谁,因为你俩边的情况都必须是合理的才是正确的
				node1[i].ca = node1[i + 1].ca + 1;
			total += node1[i].ca;
		}
		printf("%d\n", total);
	}
	return 0;
}


你可能感兴趣的:(北京林业大学校赛)