1. 有n个小朋友站成一排(编号从0到n-1),每个小朋友有一个rating值,存放在ratings数组中。老师需要给他们分配糖果,每个小朋友至少需要一颗糖果,对于任意相邻的两个小朋友i和i+1,rating值大的必须比rating值小的分配的糖果多(rating相同的没必要分配一样多的糖果)。 请计算最少需要多少颗糖果,才能完成上述分配。 输入格式: 多组数据,每组数据第一行是一个正整数n。 接下来n行,每行有1个正整数,表示每个小朋友的rating值。所有整数都不超过100000。 输出格式: 每组数据一行,包括一个正整数,表示做少需要的糖果数。
输入样例
3
1
2
2
输出样例:
4
#include<iostream>
using namespace std;
class CHILD_STR
{
public:
long rating;//小孩等级
long candynum; //小孩所得糖果数
}CHILD;
int main()
{
long l_ChildNum;
cin>>l_ChildNum; //输入孩子数目
CHILD_STR *A=new CHILD_STR[l_ChildNum];
for(long i=0;i<l_ChildNum;i++)
{
long tmp;
cin>>tmp;
A[i].candynum=1; //初始给每个小孩都发一颗糖
A[i].rating=tmp;
}
for(long i=0;i<l_ChildNum-1;i++)
{
long CurRating=A[i].rating;
long NextRating=A[i+1].rating;
if(CurRating<NextRating)
{
A[i+1].candynum=A[i].candynum+1;
}
else if(CurRating>=NextRating) // 优先级为5 3 1 2 4 则需要先找到降序排列的末尾小孩 反过来递加糖果
{
long tp=i+1;
while(1)
{
if(tp<l_ChildNum-1)
{
if(A[tp].rating>=A[tp+1].rating)
{
tp++;
}
else
{
break;
}
}
else
{
break;
}
}
for(long j=tp;j>i;j--)
{
if(A[j].rating==A[j-1].rating)
{
/*
if(A[j].candynum>A[j-1].candynum)
{
A[j-1].candynum=A[j].candynum;
}
else
{
A[j].candynum=A[j-1].candynum;
}
*/
}
else
{
if(A[j].candynum+1>A[j-1].candynum)
{
A[j-1].candynum=A[j].candynum+1;
}
}
}
}
}
long long candysum=0;
for(long i=0;i<l_ChildNum;i++)
{
cout<<A[i].candynum<<" ";
candysum+=A[i].candynum;
}
cout<<candysum<<endl;
system("pause");
return 0;
}