首页 > 试题广场 >

厨艺大赛奖金

[编程题]厨艺大赛奖金
  • 热度指数:2652 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 64M,其他语言128M
  • 算法知识视频讲解
小米食堂每年都会举办一次厨艺大赛,假设参赛的厨师一共有n位(n < 1000),比赛结束后没有公布评分,但是站在领奖台上的一排厨师中每位厨师都能看到与自己相邻的厨师(左或者右)里评分比自己低(看不到比自己分数高的人的分数)的评分。比赛结束之后要发奖金,以1K为单位,每位厨师至少会发1K的奖金,另外,如果一个厨师发现自己的奖金没有高于比自己评分低的厨师的奖金,就会不满意,作为比赛组织方,小米食堂至少需要发放多少奖金才能让所有厨师满意。

输入描述:
每组数据为n+1个正整数单空格分割,其中第一个数为参赛厨师的人数,后面n个数为每位厨师的得分(0-100)


输出描述:
输出至少需要多少K的奖金
示例1

输入

10 60 76 66 76 85 55 61 71 84 62

输出

20
从左至右,看自己左侧的厨师分数,比自己小的,在他的基础上加一
从右至左,看自己右侧的厨师分数,比自己小的,max(自己,右侧+1)
point =[int(i) for i in input().split(' ')]
n =point[0]
money =[1 for i in range(n+1)]
for i in range(1, n+1):
    if i-1> 0 and i-1<=n:
        if point[i-1] < point[i]:
            money[i] =money[i-1]+1
for i in range(n, 0, -1):
    if i+1> 0 and i+1<=n:
        if point[i+1] < point[i]:
            money[i] =max(money[i], money[i+1]+1)
print(sum(money)-1)

发表于 2019-03-12 15:44:47 回复(0)
//从左到右扫描找出左边连续最大的数
//从右到左扫描找出右边连续最大的数
//最后把每个数的左右其中最大的一个加起来即可
#include<iostream>
(720)#include<vector>
#include<algorithm>
using namespace std;
int main()
{
    int n;
    cin>>n;
    vector<int> v(n);
    for(int i=0;i<n;i++)
        cin>>v[i];
    vector<int> L(n);
    vector<int> R(n);
    int count=0;
    for(int i=1;i<n;i++)
    {
       if(v[i-1]<v[i])
       {
           count++;
           L[i]=count;
       }
        else
            count=0;
    }
    count=0;
    for(int j=n-2;j>=0;j--)
    {
        if(v[j]>v[j+1])
        {
            count++;
            R[j]=count;
        }
        else
            count=0;
    }
    int sum=0;
    for(int i=0;i<n;i++)
        sum+=max(L[i],R[i])+1;
    cout<<sum;
}

发表于 2020-03-25 10:56:06 回复(0)
#include <bits/stdc++.h>
using namespace std;
int main(){
    int n;
    cin>>n;
    vector<int> arr(n),dp(n);
    for(int i=0;i<n;i++){
        cin>>arr[i];
    }
    dp[0]=1;
    for(int i=1;i<n;i++)
        dp[i]= arr[i]>arr[i-1]? dp[i-1]+1:1;
    for(int i=n-2;i>=0;i--){
        if(arr[i]>arr[i+1])
            dp[i]=max(dp[i+1]+1,dp[i]);
    }
    int sum=0;
    for(int i=0;i<n;i++)
        sum+=dp[i];
    cout<<sum;
    return 0;
}

发表于 2019-10-23 15:33:37 回复(0)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;


public class Main {


    /**
     * 分糖果类型题
     * 首先从左往右遍历一遍数组,我分数比你高,那我必须比你多一千块,这样便利一遍就能确保相对于左边满足了条件
     * 在从右边往左边遍历一遍,我比你分数高,但是我的钱跟你一样甚至比你少,我必须要比你多1000块
     * 两边遍历后就分配好了
     */
    public static void main(String[] args) throws IOException {
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        String[] line1 = bf.readLine().split(" ");
        int n = Integer.parseInt(line1[0]);
        int[] score = new int[n];
        int[] money = new int[n];
        for (int i = 0; i < n; i++) {
            score[i] = Integer.parseInt(line1[i + 1]);
            //从左往右遍历,如果i比i-1的分数高,那我的钱一定要比你多
            if (i > 0 && score[i] > score[i - 1]) {
                money[i] = money[i - 1] + 1;
            }
        }
        //在从右往左遍历
        int sum = n;
        for (int i = n - 2; i >= 0; i--) {
            if (score[i] > score[i + 1] && money[i] <= money[i + 1]) {
                money[i] = Math.max(money[i], money[i + 1] + 1);
            }
        }
        for (int i = 0; i < n; i++) {
            sum += money[i];
        }
        System.out.println(sum);
    }
}
发表于 2019-08-02 22:41:56 回复(0)
#include <bits/stdc++.h>
using namespace std;
int main(){
    int n;
    cin>>n;
    int a[n],b[n];
    for(int i=0;i<n;i++)
        cin>>a[i];
    b[0] = 1;
    for(int i=1;i<n;i++){
        if(a[i]>a[i-1])
            b[i] = b[i-1] + 1;
        else
            b[i] = 1;
    }
    for(int i=n-1;i>0;i--){
        if(a[i]<a[i-1])
            b[i-1] = max(b[i-1], b[i]+1);
    }
    int s = 0;
    for(int i=0;i<n;i++)
        s += b[i];
    cout<<s<<endl;
    return 0;
}
/*
10
60 76 66 76 85 55 61 71 84 62
1  2  1  2  3  1  2  3  4  1
*/

发表于 2019-07-25 01:16:33 回复(0)
按评分由低到高给就行了,也不同左右循环两遍
#include <stdio.h>
#include <string.h>
#include <vector>
#include <algorithm>
using namespace std;
const int maxn=1000+10;
  
vector<int> vec[110];
int vis[1010];
int a[1010];
  
int main()
{
    int i,j,n;
    scanf("%d",&n);
    for(i=1;i<=n;i++){
        scanf("%d",&a[i]);
        vec[a[i]].push_back(i);
    }
    int res=0;
    for(i=0;i<=100;i++){
        if(vec[i].size()==0)
            continue;
        for(j=0;j<vec[i].size();j++){
            int id=vec[i][j];
            int z=0;
            if(id>1 && a[id-1]<a[id])
                z=max(z,vis[id-1]);
            if(id<n && a[id+1]<a[id])
                z=max(z,vis[id+1]);
            res+=z+1;
            vis[id]=z+1;
        }
    }
    printf("%d\n",res);
    return 0;
}

编辑于 2019-04-27 17:22:41 回复(2)
#include <bits/stdc++.h>
using namespace std;
int main()
{
    int n;
    vector<int>num,p;
    while(cin>>n)
    {
        for(int i=0;i<n;i++)
        {
            int m;
            cin>>m;
            num.push_back(m);
            p.push_back(1);
        }
        for(int i=1;i<num.size();i++)
            if(num[i]>num[i-1])
                p[i]=p[i-1]+1;
        int sum=0;
        for(int j=n-2;j>=0;j--)
            if(num[j]>num[j+1])
                p[j]=max(p[j], p[j+1]+1);
        for(int j=0;j<n;j++)
            sum+=p[j];
        cout<<sum<<endl;
    }
    return 0;
}

发表于 2019-07-04 22:49:28 回复(0)
#include<bits/stdc++.h>

using namespace std;

const int N=1e5+100;
int n;
int a[N];
int f[N];
int g[N];

int main(){
    ios::sync_with_stdio(false);
    while(cin>>n){
        for(int i=1;i<=n;i++) cin>>a[i];
        f[1]=g[n]=1;
        for(int i=2;i<=n;i++)
            if(a[i]>a[i-1]) f[i]=f[i-1]+1;
            else f[i]=1;
        
        for(int i=n-1;i;i--)
            if(a[i]>a[i+1]) g[i]=g[i+1]+1;
            else g[i]=1;
        int ans=0;
        for(int i=1;i<=n;i++) ans+=max(f[i],g[i]);
        cout<<ans<<endl;
    }
    return 0;
}

发表于 2021-05-12 01:57:58 回复(0)
#include<iostream>
#include<vector>

using namespace std;
int main() {
    int number;
    vector<int> numbers;
    vector<int> a;
    while (cin>>number)
    {
        numbers.push_back(number);
    }
    int sum = 0;
    int min = 1;
    int k = 0;
    for (int i = 1; i < numbers.size(); i++)
    {
        if (i==1)
        {
            if (numbers[1] <=numbers[2]) {

                a.push_back(1);
            }
            else
            {
                a.push_back(2);
            }
        }
         else if(numbers[i - 1] <numbers[i])
        {
             a.push_back(a[a.size()-1]+1);
        }
         else 
        {
            a.push_back(1);
        }
    }
    for (int i = numbers.size()-2; i >0; i--)
    {
     if (numbers[i]>numbers[i+1]&&a[i-1]<=a[i])
        {
         a[i-1] = a[i] + 1;
        }
    }
    for (int i = 0; i <a.size(); i++)
    {
        sum = sum + a[i];
    }
    cout << sum << endl;
    return 0;
}
发表于 2021-02-03 15:50:26 回复(0)
leecode标准解法,默写的答案
空间复杂度O(1),时间复杂度1N
判断一下,如果之前是降低但这次没降,隔断
如果之前是上升这次是不升不降,隔断
注意边界什么的就可以了。
data = [int(x) for x in input().split()]
data.pop(0)
def count(n):
    return n*(n+1)//2

up,down = 0,0
old_d,cur_d = 0,0
res = 0
for i in range(1,len(data)):
    if data[i]>data[i-1]:
        cur_d = 1
    elif data[i]<data[i-1]:
        cur_d = -1
    else:
        cur_d = 0
    if old_d==-1 and cur_d >=0 or old_d==1 and cur_d ==0:
        #先降再平升 或者先升在平
        res+=count(up)+count(down)+max(up,down)
        up,down = 0,0
    #
    if data[i]>data[i-1]:
        up+=1
    elif data[i]<data[i-1]:
        down +=1
    else:
        res+=1
    old_d = cur_d
res+=count(up)+count(down)+max(up,down)+1
print(res)


编辑于 2019-11-06 22:33:48 回复(0)
100的用例,输出203,应该198,找了半天错误,原来自己做的时候默认认为身边分数相等的奖金必须要一样。。。。
编辑于 2019-09-05 17:24:25 回复(0)
这道题目想得过于复杂了=,=搞了半天不知道为啥最小值是20,然后很久之后才发现这道题目里面的人是不能移动位置的。。。我顶你个肺啊,选择题就有几道题目有问题,编程题还这样子搞=。=不能解释的清楚一点?你出这种题有什么意义?
发表于 2019-09-04 22:46:01 回复(0)
data = list(map(int, input().split()))
n = data.pop(0)
res = [1 for _ in range(n)]
for i in range(1,n):
    if data[i] > data[i-1]:
        res[i] = res[i-1] + 1
for j in range(n-2, -1, -1):
    if data[j] > data[j+1]:
        res[j] = max(res[j], res[j+1] + 1)
print(sum(res))
        
发表于 2019-08-20 07:53:37 回复(0)
和分糖果那道题目完全一样!
def score(num):
    res = [1 for _ in range(len(num))]
    for i in range(len(num)-1):
        if num[i]<num[i+1]:
            res[i+1] = res[i]+1
    for j in range(len(num)-2,-1,-1):
        if num[j]>num[j+1]:
            res[j] = max(res[j],res[j+1]+1)
    return sum(res)
if __name__=='__main__':
    num = list(map(int,input().split()))
    person = num[1:]
    print(score(person))


发表于 2019-08-09 19:45:40 回复(0)
先分为三类:1.比左右都低的 2.只比左右其中之一高的 3.比左右都高
先给1发. 再做以下循环:给属于2且左右之中比他低的已经发了奖金的人发奖金. 再给3发
发表于 2019-07-05 16:33:57 回复(0)
#include<bits/stdc++.h>
usingnamespacestd;
intmain(){
    vector<int> scores(1000,0);
    intn;
    cin>>n;
    for(inti=0;i<n;i++){
        cin>>scores[i];
    }
    vector<int> bonus(n,1);
    for(inti=1;i<n;i++){
        if(scores[i]>scores[i-1])
            bonus[i]=bonus[i-1]+1;
    }
    for(inti=n-2;i>=0;i--){
        if(scores[i]>scores[i+1])
            bonus[i]=max(bonus[i+1]+1,bonus[i]);
    }
    intsum=0;
    for(inti=0;i<n;i++){
        sum += bonus[i];
    }
    cout<<sum<<endl;
    return0;
}
发表于 2019-04-12 18:20:44 回复(0)