There are N children standing in a line. Each child is assigned a rating value.
You are giving candies to these children subjected to the following requirements:
Each child must have at least one candy.
Children with a higher rating get more candies than their neighbors.
What is the minimum candies you must give?
题目挺复杂的,要完全理解题意,详见注释
class Solution {
public:
int candy(vector<int> &ratings) {
const unsigned int lens=ratings.size();
int* dp=new int[lens];
memset(dp,0,lens*sizeof(*dp)); //初始化为0,dp代表第i个人拿的糖果数
dp[0]=1;
int min=1;
for(int i=1;i<lens;++i)
{
if(ratings[i]>ratings[i-1]) //如果后一个大于前一个,此人拿的糖果数一定是前一个加1;
dp[i]=1+dp[i-1];
else if(ratings[i]==ratings[i-1])//如果后一个等于前一个,此人要拿最少的糖果数也就是
//个.以为只要保证概率大的比邻居的糖果多就像,
//相等的话肯定只给一个就好.
{
dp[i]=1;
}
else //如果小于分两种情况
{
if(dp[i-1]>1) //前一个如果大于1,那么只要给其一个糖果
dp[i]=1;
else
{
dp[i]=1; //否则给其一个糖果,并且前面的也要多给一个
int j=i-1;
for(;j>=1;--j)
{
dp[j]=dp[j]+1;
if(ratings[j]>=ratings[j-1]||dp[j]<dp[j-1]) //直到给的那个人的概率比前一个人大,相等,或者虽然这个人概率比前一个小,但是得到的糖果也比前一个小.
break;
}
if(j==0&&ratings[1]<ratings[0]&&dp[1]>=dp[0]) //判断最开始两个,也是上面相同的判断条件.
++dp[0];
}
}
}
int count=0;
for(int i=0;i<lens;++i)
{
count+=dp[i];
}
delete[] dp;
return count;
}
};
标准答案,从左向右扫描一遍,再从右向左扫描一遍,聪明的人还是多啊
class Solution {
public: int candy(vector<int> &ratings) {
//题意:N个孩子站成一排,每个孩子分配一个分值。给这些孩子派发糖果,满足如下要求:
//每个孩子至少一个
//分值更高的孩子比他的相邻位的孩子获得更多的糖果
//求至少分发多少糖果?
int len=ratings.size();
if(len==1) return 1;
int sum=0;
vector<int> v(len,1);//初始将每个孩子的糖果数都设为1
//从左向右扫描,保证一个方向上分数更大的糖果更多
for(int i=1;i<len;i++){
if(ratings[i] > ratings[i-1])
v[i]=v[i-1]+1;
}
//从右向左扫描,保证另一个方向上分数更大的糖果更多
for(int i=len-2;i>=0;i--){
if(ratings[i] > ratings[i+1] && v[i] <= v[i+1])
v[i]=v[i+1]+1;
}
for(int i=0;i<len;i++){
sum+=v[i];
}
return sum;
}
};