分配糖果问题

CQU_Mr_wang 2014-08-14 07:39:13
题目详情:
有n个小朋友站成一排(编号从0到n-1),每个小朋友有一个rating值,存放在ratings数组中。老师需要给他们分配糖果,每个小朋友至少需要一颗糖果,对于任意相邻的两个小朋友i和i+1,rating值大的必须比rating值小的分配的糖果多(rating相同的没必要分配一样多的糖果)。
请计算最少需要多少颗糖果,才能完成上述分配。
输入格式:
多组数据,每组数据第一行是一个正整数n。
接下来n行,每行有1个正整数,表示每个小朋友的rating值。所有整数都不超过100000。
输出格式:
每组数据一行,包括一个正整数,表示做少需要的糖果数。


答题说明:
输入样例
3
1
2
2
输出样例:
4

我的代码:
#include <iostream>
#include <string>
using namespace std;

int main (){
int ratings[100]={0};
int result[100]={0};
int rating;
cin>>rating;
for(int i=0;i<rating;i++){
cin>>ratings[i];
}

result[0]=1;

for(int i=0;i<rating;i++){
if(ratings[i+1]>ratings[i])
result[i+1]=result[i]+1;
else
result[i+1]=1;
}

for(int i=rating-1;i>=0;i--){
if((ratings[i-1]>ratings[i])&&(result[i-1]==result[i]))
result[i-1]=result[i]+1;
}

int results=0;
for(int i=0;i<rating;i++){
results+=result[i];
}
cout<<results<<endl;
return 0;
}

我验证了几种情况,都没有问题,能正确输出,但是提交后说是有问题,麻烦各位大神看看我哪里没有弄好。
...全文
491 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
pengxn 2014-10-27
  • 打赏
  • 举报
回复
感觉题目里面最好能明确一下,小朋友排序是随机的。算法是要找出这种排序的最小分配量
qqqqqqqh 2014-09-21
  • 打赏
  • 举报
回复
rating相同的没必要分配一样多的糖果,这个条件最坑
漂浮一生 2014-09-09
  • 打赏
  • 举报
回复
引用 14 楼 xgdgxb 的回复:
先每人分1个糖果。 从左向右遍历一遍,如果右边比左边的rating大,就令右边的孩子比左边多一个糖果。 从右向左遍历一遍,如果左边比右边的rating大,并且糖果数不满足要求,就令左边的孩子比右边多一个糖果。 long long minimalCandies(vector<int> &ratings) { int N = ratings.size(); int candy[N]; for (int i = 0; i < N; ++i) candy[i] = 1; for (int i = 1; i < N; ++i) if (ratings[i] > ratings[i-1]) candy[i] = candy[i-1] + 1; for (int i = N-2; i >= 0; --i) if (ratings[i] > ratings[i+1] && candy[i] <= candy[i+1]) candy[i] = candy[i+1] + 1; long long res = 0; for (int i = 0; i < N; ++i) res += candy[i]; return res; }
这个才是正解
漂浮一生 2014-09-09
  • 打赏
  • 举报
回复
引用 13 楼 u012825445 的回复:
使用分治策略,将rating分为[0...n-1] [n],假设a[n-1],a[n]为第n-1,n个人的rating值,x[n-1],x[n]为第n-1,n个人应分配的糖果数,则当x[n-1]=1时,如果a[n]>a[n-1],则x[n]=x[n-1]+1=2;否则,x[n]=1当x[n-1]>1时,如果a[n]>a[n-1];则x[n]=x[n-1]+1;否则x[n]=1;问题规模缩小为n-1,然后用递归求解。
果然是大神
码到功成 2014-09-08
  • 打赏
  • 举报
回复
引用 14 楼 xgdgxb 的回复:
先每人分1个糖果。 从左向右遍历一遍,如果右边比左边的rating大,就令右边的孩子比左边多一个糖果。 从右向左遍历一遍,如果左边比右边的rating大,并且糖果数不满足要求,就令左边的孩子比右边多一个糖果。 long long minimalCandies(vector<int> &ratings) { int N = ratings.size(); int candy[N]; for (int i = 0; i < N; ++i) candy[i] = 1; for (int i = 1; i < N; ++i) if (ratings[i] > ratings[i-1]) candy[i] = candy[i-1] + 1; for (int i = N-2; i >= 0; --i) if (ratings[i] > ratings[i+1] && candy[i] <= candy[i+1]) candy[i] = candy[i+1] + 1; long long res = 0; for (int i = 0; i < N; ++i) res += candy[i]; return res; }
简单易行
码到功成 2014-09-07
  • 打赏
  • 举报
回复
引用 13 楼 u012825445 的回复:
使用分治策略,将rating分为[0...n-1] [n],假设a[n-1],a[n]为第n-1,n个人的rating值,x[n-1],x[n]为第n-1,n个人应分配的糖果数,则当x[n-1]=1时,如果a[n]>a[n-1],则x[n]=x[n-1]+1=2;否则,x[n]=1当x[n-1]>1时,如果a[n]>a[n-1];则x[n]=x[n-1]+1;否则x[n]=1;问题规模缩小为n-1,然后用递归求解。
递归解决不了这个问题, func(n)=func(n-1)+1时,其中的func(n-1)是没法确定的,因为func(n-1)反依赖于n及以后的值。
xgdgxb 2014-09-04
  • 打赏
  • 举报
回复
先每人分1个糖果。 从左向右遍历一遍,如果右边比左边的rating大,就令右边的孩子比左边多一个糖果。 从右向左遍历一遍,如果左边比右边的rating大,并且糖果数不满足要求,就令左边的孩子比右边多一个糖果。 long long minimalCandies(vector<int> &ratings) { int N = ratings.size(); int candy[N]; for (int i = 0; i < N; ++i) candy[i] = 1; for (int i = 1; i < N; ++i) if (ratings[i] > ratings[i-1]) candy[i] = candy[i-1] + 1; for (int i = N-2; i >= 0; --i) if (ratings[i] > ratings[i+1] && candy[i] <= candy[i+1]) candy[i] = candy[i+1] + 1; long long res = 0; for (int i = 0; i < N; ++i) res += candy[i]; return res; }
simplify20 2014-08-28
  • 打赏
  • 举报
回复
使用分治策略,将rating分为[0...n-1] [n],假设a[n-1],a[n]为第n-1,n个人的rating值,x[n-1],x[n]为第n-1,n个人应分配的糖果数,则当x[n-1]=1时,如果a[n]>a[n-1],则x[n]=x[n-1]+1=2;否则,x[n]=1当x[n-1]>1时,如果a[n]>a[n-1];则x[n]=x[n-1]+1;否则x[n]=1;问题规模缩小为n-1,然后用递归求解。
nice_cxf 2014-08-15
  • 打赏
  • 举报
回复
1,2,3,4,5,3,2,1,你自己看看结果对不对
CQU_Mr_wang 2014-08-15
  • 打赏
  • 举报
回复
引用 1 楼 u012421456 的回复:
它有没有提示是哪里有问题
没有说,估计是这种方法不怎么全面,但是我想不出其他的办法
CQU_Mr_wang 2014-08-15
  • 打赏
  • 举报
回复
引用 2 楼 nice_cxf 的回复:
逻辑不对,没你想的这么简单
那应该是怎样的?
nice_cxf 2014-08-15
  • 打赏
  • 举报
回复
逻辑不对,没你想的这么简单
lm_whales 2014-08-15
  • 打赏
  • 举报
回复
是的,具体算法,我也没有想出来,里面有些头绪要理清。
CQU_Mr_wang 2014-08-15
  • 打赏
  • 举报
回复
引用 6 楼 lm_whales 的回复:
按照 rating 分割,成超过二人连续相等序列,以及不等序列(包括二人相等在内)。 按照台阶个数,分配糖果。 最低台阶位置分配一个,每提高一个台阶多分配一个。 A B C /\ /\ _ / \ /\ / \ /\ /\/ \ _ _ _ _ _ / \ / \/ \________ / \ / \ \/ 1 \/ D 1 1 1 1 1 1 1 1 1 1 1 1 1 详细分配策略如下: 对数据进行分段,连续相等超过2人的为一段 连续不超过2人的计算台阶数其中,谷底糖果数基数为1 超过2人的连续相等序列段 糖果数基数为1 谷底之上按照台阶数计 峰处取两边的最大值台阶数,其他从谷底计算台阶数. 左右两边,非峰值处视为谷底。 峰出如 A 处 从左谷底计算 1 +1+1 =3 从右谷底计算 1+1+1+1 =4 取最大值4, 其他按照台阶数从谷底计算每升一个台阶糖果数+1
谢谢你的解答,很形象,容易理解,但感觉算法写起来还是不那么容易
CQU_Mr_wang 2014-08-15
  • 打赏
  • 举报
回复
引用 5 楼 nice_cxf 的回复:
1,2,3,4,5,3,2,1,你自己看看结果对不对
输出了19,本来正确的应该是21,对吧? 我想了一下, 我把for(int i=rating-1;i>=0;i--){ if((ratings[i-1]>ratings[i])&&(result[i-1]==result[i])) result[i-1]=result[i]+1; } 这段代码改正: for(int i=rating-1;i>=0;i--){ if((ratings[i-1]>ratings[i])&&(result[i-1]<=result[i])) result[i-1]=result[i]+1; } 然后就能算出是21
pengxn 2014-08-15
  • 打赏
  • 举报
回复
感觉题目里面最好能明确一下,小朋友排序是随机的。算法是要找出这种排序的最小分配量
lm_whales 2014-08-15
  • 打赏
  • 举报
回复
A B C D E /\ /\ _ / \ /\ / \ /\ /\/ 1 \ _ _ _ _ _ / \ / \/ \________ / \ / \ \/ 1 \/ F 1 1 1 1 1 1 1 1 1 1 1 1 1 D 处直接为1 E 处取1 和 从谷底算出的最大值
lm_whales 2014-08-15
  • 打赏
  • 举报
回复
连续相等的两个也应该算谷底,只是有可能同时为谷底
lm_whales 2014-08-15
  • 打赏
  • 举报
回复
按照 rating 分割,成超过二人连续相等序列,以及不等序列(包括二人相等在内)。 按照台阶个数,分配糖果。 最低台阶位置分配一个,每提高一个台阶多分配一个。 A B C /\ /\ _ / \ /\ / \ /\ /\/ \ _ _ _ _ _ / \ / \/ \________ / \ / \ \/ 1 \/ D 1 1 1 1 1 1 1 1 1 1 1 1 1 详细分配策略如下: 对数据进行分段,连续相等超过2人的为一段 连续不超过2人的计算台阶数其中,谷底糖果数基数为1 超过2人的连续相等序列段 糖果数基数为1 谷底之上按照台阶数计 峰处取两边的最大值台阶数,其他从谷底计算台阶数. 左右两边,非峰值处视为谷底。 峰出如 A 处 从左谷底计算 1 +1+1 =3 从右谷底计算 1+1+1+1 =4 取最大值4, 其他按照台阶数从谷底计算每升一个台阶糖果数+1
百曉生 2014-08-14
  • 打赏
  • 举报
回复
它有没有提示是哪里有问题

64,682

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧