首页 > 解决方案 > 有人可以解释我在解决这个问题的方法中做错了什么吗

问题描述

爱丽丝是一名幼儿园老师。她想给班上的孩子们一些糖果。所有的孩子排成一排,每个孩子都根据他或她在课堂上的表现打分。Alice 想给每个孩子至少 1 颗糖果。如果两个孩子坐在一起,那么评分较高的孩子必须得到更多的糖果。爱丽丝想尽量减少她必须购买的糖果总数。

例子

她给学生糖果的最小数量如下: . 她必须至少购买 10 颗糖果。

功能说明

在下面的编辑器中完成糖果功能。

candies 具有以下参数:

int n:班级中孩子的数量

int arr[n]: 每个学生的评分 Returns

int:爱丽丝必须购买的最少糖果数量 输入格式

第一行包含一个整数 ,n ,即 arr 的大小。

接下来的 n 行中的每一行都包含一个整数 arr[i],表示位置为 的学生的评分。

约束

1<n<10^5

1<arr[i]<10^5

样本输入 0

3
1
2
2

样本输出 0

4

解释 0

这里 1、2、2 是评级。请注意,当两个孩子的评分相同时,他们可以拥有不同数量的糖果。因此,最佳分布将是 1、2、1。

样本输入 1

10
2
4
2
6
1
7
8
9
2
1

样本输出 1

19

解释1

最佳分布将是 1 2 1 2 1 2 3 4 2 1。

样本输入 2

8
2
4
3
5
2
6
4

样本输出 2

12

解释2

最佳分布将是 1 2 1 2 1 2 1 2。

#include<iostream>
#include <algorithm>
using namespace std;

int main()
{
    int n;
    cin>>n;
    int arr[n],arr1[n];
    
    for(int i=0; i<n;i++)
    {
        arr[i]=0;
        arr1[i]=1;
    }
    
    for(int i=0; i<n;i++)
    {
        cin>>arr[i];
    }
    
    
    for(int i=1; i<n-1;i++)
    {
        if((arr[i]>arr[i-1]) && (arr[i]>arr[i+1]))
        {
            arr1[i]=(max(arr1[i-1],arr1[i+1])+1);
        }
        else if(arr[i]>arr[i-1])
        {
            arr1[i]=arr1[i-1]+1;
        }
        else if(arr[i]>arr[i+1])
        {
            arr1[i]=arr1[i+1]+1;        
        }
        else 
        {
        
        }
       
        
    }
    
    for(int i=1; i<n-1;i++)
    {
        if((arr[i]>arr[i-1]) && (arr[i]>arr[i+1]))
        {
            if((arr1[i]>arr1[i-1]) && (arr1[i]>arr1[i+1]))
            {
                
            }
            else 
            {
                arr1[i]=max(arr1[i-1],arr1[i+1])+1;
            }
        }
        else if(arr[i]>arr[i-1])
        {
            if(arr1[i]>arr1[i-1])
            {
                
            }
            else 
            {
                arr1[i]=arr1[i-1]+1;
            }     
        }
        else if(arr[i]>arr[i+1])
        {
            if(arr1[i]>arr1[i+1])
            {
                
            }
            else 
            {
                arr1[i]=arr1[i+1]+1;
            }     
        }
        else 
        {
             
        }
        
    }
    
    
    
    if(arr[n-1]>arr[n-2])
    {
        arr1[n-1]=arr1[n-2]+1;
    }
    else 
    {
        
    }
    
    if(arr[0]>arr[1])
    {
        arr1[0]=arr1[1]+1;
    }
    else {
    
    }
    
    int sum=0;
    for(int i=0; i<n;i++)
    {
        sum+=arr1[i];
    }
    cout<<sum;
    
    
    return 0;
}

我的方法:我想象孩子们的编号从 0 到 n-1。
arr[](这个数组存储了孩子的排名,数组的索引对应着孩子的号码)
arr1[](这个数组存储了糖果的分布,数组的索引对应着孩子的号码)

中的所有元素arr1[]都初始化为1。

在第一个循环中,我使用了最大值-最小值的概念。

如果 in 的值arr[i]是最大值,那么我存储max(arr1[i-1], arr1[i+1])arr1[i].

如果 in 的值在arr[i]增加,即大于arr[i-1]但小于arr[i+1]然后 arr1[i]=arr1[i-1]+1;执行。

如果 in 的值在arr[i]减少,即大于arr[i+1]但小于,arr[i-1]arr1[i]=arr1[i=1]+1;执行。

如果arr[i]是最小值,则什么都不会发生,并且 in 的值arr1[i]保持为 1。

在第二个循环中执行了类似的操作,但现在我检查值是否正确arr1[]

如果其中的数字arr[i]是最大值,我检查存储的数字arr1[i]是否是最大值,如果不是,那么我将值增加到正确的数量。

我也对增加、减少和最小值做同样的事情。

最后我打印输出。

请解释我的代码有什么问题。

标签: c++arrays

解决方案


推荐阅读