太多if语句,爆0检查不出来

题目描述

老师想给孩子们分发糖果,有 N 个孩子站成了一条直线,老师会根据每个孩子的表现,预先给他们评分。你需要按照以下要求,帮助老师给这些孩子分发糖果:每个孩子至少分配到 1 个糖果。相邻的孩子中,评分高的孩子必须获得更多的糖果。那么这样下来,老师至少需要准备多少颗糖果呢?

输入格式

第一行一个 n,表示孩子数。(1≤n≤100)
接下来一行,输入n个孩子的评分 si。(0≤si​ ≤10)

输出格式

糖果数

样例

Input 1

3
1 0 2

Output 1

5

样例解释

解释: 你可以分别给这三个孩子分发 2、1、2 颗糖果。

数据范围

1<=n<=100 1<=孩子的分数<=10

#include<bits/stdc++.h>
using namespace std;
int main(){
  long long n,a[101],b[101],x=0,m,ans=0;
  memset(b,0,sizeof(b));
  cin>>n>>a[0];
  m=a[0];
  for(int i=0;i<n;i++){
    cin>>a[i];
    if(m>a[i]){
      m=a[i];
      x=i;
    }
  }b[x]=1;
  for(int i=0;i<n;i++){
    for(int j=0;j<n;j++){
      if(b[j]||(!b[j-1]&&!b[j+1]))continue;
      if(b[j-1]&&b[j+1]){
        if(a[j]==a[j-1])b[j]=b[j-1];
        else if(a[j]==a[j+1])b[j]=b[j+1];
        else if(a[j]>max(a[j-1],a[j+1])){
          if(a[j-1]>a[j+1])b[j]=b[j-1]+1;
          else b[j]=b[j+1]+1;
        }else if(a[j]<min(a[j-1],a[j+1])){
          if(a[j-1]<a[j+1])b[j]=b[j-1]-1;
          else b[j]=b[j+1]-1;
        }else{
          if(a[j-1]<a[j])b[j]=min(b[j-1]+1,b[j+1]-1);
          else b[j]=min(b[j-1]-1,b[j+1]+1);
        }
      }else if(b[j-1]&&!b[j+1]){
        if(a[j-1]>a[j])b[j]=b[j-1]-1;
        else b[j]=b[j-1]+1;
      }else{
        if(a[j+1]>a[j])b[j]=b[j+1]+1;
        else b[j]=b[j+1]-1;
      }
    }
  }for(int i=0;i<n;i++)ans+=b[i];
  cout<<ans;
  return 0;
}
1 个赞

嗯……

此帖子已被社区举报,现已被临时隐藏。

1 个赞

等下,我按照你的方法写代码,怎么爆0了?

#include<bits/stdc++.h>
using namespace std;
int main(){
  int n,a[101],b[101],ans=0;
  cin>>n;
  for(int i=0;i<n;i++){
    cin>>a[i];
    b[i]=1;
  }for(int i=1;i<n;i++){
    if(a[i]>a[i-1])b[i]=b[i-1]+1;
  }for(int i=n-2;i>=0;i--){
    if(a[i+1]>a[i])b[i]=b[i+1]-1;
    ans+=b[i];
  }cout<<ans+b[n-1]+1;
  return 0;
}

我用的普及组的贪心

你的&&语句呢

#include<bits/stdc++.h>
using namespace std;
int main(){
  int n,a[101],b[101],ans=0;
  cin>>n;
  for(int i=0;i<n;i++){
    cin>>a[i];
    b[i]=1;
  }for(int i=1;i<n;i++){
    if(a[i]>a[i-1])b[i]=b[i-1]+1;
  }for(int i=n-2;i>=0;i--){
    if(a[i+1]>a[i]&&b[i]<=b[i+1])b[i]=b[i+1]-1;
    ans+=b[i];
  }cout<<ans+b[n-1]+1;
  return 0;
}

still 爆0

那你会用函数吗,我试着用函数跟你看一下

不会我怎么上普及班

你普及这题你不用贪心做?贪心算法

不太会

已AC

给个解决方案

这是贪心简介和算法



image

谢谢