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; }