列表

详情


SH3. 发奖金

描述

 狐进行了一次黑客马拉松大赛,全公司一共分为了N个组,每组一个房间排成一排开始比赛,比赛结束后没有公布成绩,但是每个组能够看到自己相邻的两个组里比自己成绩低的组的成绩,比赛结束之后要发奖金,以1w为单位,每个组都至少会发1w的奖金,另外,如果一个组发现自己的奖金没有高于比自己成绩低的组发的奖金,就会不满意,作为比赛的组织方,根据成绩计算出至少需要发多少奖金才能让所有的组满意。 

输入描述

每组数据先输入N,然后N行输入N个正整数,每个数表示每个组的比赛成绩。

输出描述

输出至少需要多少w的奖金

示例1

输入:

10
20 
32 
12 
32 
45 
11 
21 
31 
41 
33

输出:

20

原站题解

C++ 解法, 执行用时: 1ms, 内存消耗: 376KB, 提交时间: 2017-09-22

#include<iostream>
#include<vector>
using namespace std;
int main()
    {
    int n;
    while(cin>>n)
        {
        vector<int>score(n,0);
        for(int i=0;i<n;i++)
            cin>>score[i];
        vector<int>money(n,1);//每组至少分1w,所以初始化为1w 
        for(int i=1;i<n;i++)/*从前往后,如果score[i]>score[i-1],money[i]=money[i-1]+1;
		score[i]==score[i-1]由于不可见,,money[i]=1即可;score[i]<score[i-1]的情况可以 
		判断money[i]<money[i-1]但无法直接确定奖金数,因为如果设money[i]=1,可能score[i+1]
		<score[i],money[i+1]<money[i] */ 
            if(score[i]>score[i-1])
                money[i]=money[i-1]+1;
        for(int i=n-2;i>=0;i--)//从后往前,可以确定钱数,查找出不符合条件的情况进行更新 
            if(score[i]>score[i+1]&&money[i]<money[i+1]+1)
                money[i]=money[i+1]+1;
        long sum=0;
        for(int i=0;i<n;i++)
            sum+=money[i];
         cout<<sum<<endl;
    }
}

C 解法, 执行用时: 2ms, 内存消耗: 372KB, 提交时间: 2020-08-15

#include<stdio.h>
int main()
{
    int n,i;
    while(scanf("%d", &n)==1)
    {
        int score[n],award[n];
        for(i=0;i<n;i++)
        {
            scanf("%d", score+i);
            award[i]=1;
        }
        for(i=1;i<n;i++)
            if(score[i]>score[i-1])
                award[i]=award[i-1]+1;
        int sum=award[n-1]; 
	    for(i=n-2;i>=0;i--)
	    {
            if(score[i]>score[i+1]&&award[i]<=award[i+1])
		    {
			    award[i]=award[i+1]+1;
		    }
		    sum+=award[i];
	    }
	    printf("%d\n",sum);
    }
    return 0;
}

C++ 解法, 执行用时: 2ms, 内存消耗: 376KB, 提交时间: 2020-11-01

#include<stdio.h>
#include<stdlib.h>

int main(){
    int N;
    while(scanf("%d", &N) != EOF){
        int *score, *money;
    
        score = (int *)malloc(sizeof(int)*N);
        money = (int *)malloc(sizeof(int)*N);
        for(int i = 0; i < N; ++i)
            scanf("%d", &score[i]);
        money[0] = 1;
        for(int i = 1; i < N; ++i)
            money[i] = 0;
        for(int i = 1; i < N; ++i){
            if(score[i] > score[i-1])
                money[i] = money[i-1]+1;
            else if(score[i] < score[i-1]){
                money[i] = 1;
                if(money[i] >= money[i-1]){
                    for(int j = i; (score[j] < score[j-1]) &&(money[j] >= money[j-1]); --j)
                        money[j-1] += 1;
                }
            }
            else
                money[i] = 1;
        }
        int sum = 0;
        for(int i = 0; i < N; ++i)
            sum += money[i];
        printf("%d\n", sum);
    }
    
    return 0;
}

C++14 解法, 执行用时: 2ms, 内存消耗: 376KB, 提交时间: 2019-08-19

#include<stdio.h>
#include<stdlib.h>

int main(){
    int N;
    while(scanf("%d", &N) != EOF){
        int *score, *money;
    
        score = (int *)malloc(sizeof(int)*N);
        money = (int *)malloc(sizeof(int)*N);
        for(int i = 0; i < N; ++i)
            scanf("%d", &score[i]);
        money[0] = 1;
        for(int i = 1; i < N; ++i)
            money[i] = 0;
        for(int i = 1; i < N; ++i){
            if(score[i] > score[i-1])
                money[i] = money[i-1]+1;
            else if(score[i] < score[i-1]){
                money[i] = 1;
                if(money[i] >= money[i-1]){
                    for(int j = i; (score[j] < score[j-1]) &&(money[j] >= money[j-1]); --j)
                        money[j-1] += 1;
                }
            }
            else
                money[i] = 1;
        }
        int sum = 0;
        for(int i = 0; i < N; ++i)
            sum += money[i];
        printf("%d\n", sum);
    }
    
    return 0;
}

C++ 解法, 执行用时: 2ms, 内存消耗: 380KB, 提交时间: 2020-10-31

#include<stdio.h>
#include<stdlib.h>

int main(){
    int N;
    while(scanf("%d", &N) != EOF){
        int *score, *money;
    
        score = (int *)malloc(sizeof(int)*N);
        money = (int *)malloc(sizeof(int)*N);
        for(int i = 0; i < N; ++i)
            scanf("%d", &score[i]);
        money[0] = 1;
        for(int i = 1; i < N; ++i)
            money[i] = 0;
        for(int i = 1; i < N; ++i){
            if(score[i] > score[i-1])
                money[i] = money[i-1]+1;
            else if(score[i] < score[i-1]){
                money[i] = 1;
                if(money[i] >= money[i-1]){
                    for(int j = i; (score[j] < score[j-1]) &&(money[j] >= money[j-1]); --j)
                        money[j-1] += 1;
                }
            }
            else
                money[i] = 1;
        }
        int sum = 0;
        for(int i = 0; i < N; ++i)
            sum += money[i];
        printf("%d\n", sum);
    }
    
    return 0;
}

上一题