一群孩子做游戏,现在请你根据游戏得分来发糖果,要求如下:
1. 每个孩子不管得分多少,起码分到一个糖果。
2. 任意两个相邻的孩子之间,得分较多的孩子必须拿多一些糖果。(若相同则无此限制)
给定一个数组arr代表得分数组,请返回最少需要多少糖果。
第一行一个整数N表示数组大小
接下来一行N个整数表示数组内的元素
输出一个整数表示答案
3 1 2 2
4
最优分配方案为1, 2, 1
#include <bits/stdc++.h> using namespace std; int main(){ int n; cin>>n; int a[n], b[n], s=0; for(int i=0;i<n;i++){ cin>>a[i]; b[i] = 1; } for(int i=1;i<n;i++) if(a[i-1]<a[i]) b[i] = b[i-1] + 1; for(int i=n-2;i>=0;i--) if(a[i]>a[i+1]) b[i] = max(b[i], b[i+1]+1); for(int i=0;i<n;i++) s += b[i]; cout<<s<<endl; return 0; }
#include<bits/stdc++.h> using namespace std; int main() { int n; cin>>n; vector<int>num(n),num1(n,1); for(int i=0;i<n;i++) cin>>num[i]; for(int i=1;i<n;i++) { if(num[i]>num[i-1]) num1[i]=num1[i-1]+1; } for(int i=n-2;i>=0;i--) { if(num[i]>num[i+1]) num1[i]=max(num1[i],num1[i+1]+1); } cout << accumulate(num1.begin(),num1.end(),0) << endl; return 0; }
import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.IOException; import java.util.Arrays; public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int n = Integer.parseInt(br.readLine()); String[] strArr = br.readLine().split(" "); int[] scores = new int[n]; for(int i = 0; i < n; i++) scores[i] = Integer.parseInt(strArr[i]); int[] candy = new int[n]; Arrays.fill(candy, 1); // 从左往右 for(int i = 1; i < n; i++){ if(scores[i] > scores[i - 1] && candy[i] <= candy[i - 1]) candy[i] = candy[i - 1] + 1; } // 从右往左 for(int i = n - 2; i >= 0; i--){ if(scores[i] > scores[i + 1] && candy[i] <= candy[i + 1]) candy[i] = candy[i + 1] + 1; } int total = 0; for(int i = 0; i < n; i++) total += candy[i]; System.out.println(total); } }
import java.util.Scanner; // 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); int length = in.nextInt(); if(length <= 0) { return; } int[] score = new int[length]; int[] candy = new int[length]; for(int i = 0; i < length; i++) { score[i] = in.nextInt(); } for(int i = 1; i < length; i++){ if(score[i] > score[i-1]) { candy[i] = candy[i-1] + 1; } } for(int j = length -2; j >= 0; j--) { if(score[j] > score[j+1]) { candy[j] = Math.max(candy[j], candy[j+1] + 1); } } int result = length; for(int i = 0; i < length; i++) { result += candy[i]; } System.out.print(result); } }代码已通过,仅供参考。
#include <bits/stdc++.h> using namespace std; int main(){ int n; scanf("%d", &n); vector<int> arr(n); vector<int> left(n,1); vector<int> right(n,1); int temp = INT_MAX, add = 1; for(int i=0; i<n; i++){ scanf("%d", &arr[i]); if(arr[i] > temp){ left[i] += add; add++; }else{ add = 1; } temp = arr[i]; } temp = arr[n-1]; add = 1; int ans = left[n-1]; for(int i=n-2; i>=0; i--){ if(arr[i] > temp){ right[i] += add; add++; }else{ add = 1; } temp = arr[i]; ans += max(left[i], right[i]); } printf("%d", ans); return 0; }
#include<stdio.h> int main() { int n; scanf("%d",&n); int m[n]; for(int i=0;i<=n-1;i++) {scanf("%d",&m[i]); }; int c[n],i,c2[n]; for(i=0;i<=n-1;i++) {c[i]=1; c2[i]=1; }; for( i=0;i<n-1;i++)//向右 {if((m[i+1]>m[i])) {c[i+1]=c[i]+1;} }; for(i=n-1;i>0;i--)//向左 {if((m[i-1]>m[i])) {c2[i-1]=c2[i]+1;} } for( i=0;i<=n-1;i++)//避免中间不一致 { if((c2[i]>c[i])) { c[i]=c2[i];} } int s=0; for( i=0;i<=n-1;i++) { s = s+c[i];} printf("%d",s); return 0; }
#include<iostream> #include<vector> #include<algorithm> #include <numeric> using namespace std; int main() { int N; cin >> N; vector<int>zq(N),candy(N,1);//每人分一个 for (int i = 0; i < N; ++i) cin >> zq[i]; for (int i = 1; i < N; ++i) if (zq[i] > zq[i - 1]) candy[i]=candy[i-1]+1;//全员向左看 for (int i = N-2; i >=0; --i) if (zq[i] > zq[i + 1]) candy[i]=max(candy[i],candy[i+1]+1);//全员向右看 cout << accumulate(candy.begin(),candy.end(),0) << endl; return 0; }