https://www.luogu.com.cn/problem/AT_cf_2015_morning_easy_c
在Coefes大学的比赛编程课上,为了成绩评价,决定进行N次的考试。各考试的成绩,是0以上以上M以下的整数值。N个的考试成绩中,如果分最高的K次测试的平均分是R分以上的话,恭喜你!你被录取了!分最高的K次测试的平均分达不到R分的情况下不合格,你不会被录取。结束了N-1次考试的你,打算参加期末考试。除期末考试外,N-1次的考试中,你的成绩,分别是S1、S2、…SN。你要在期末考试中取得多少分以上的成绩才会被录取?
Codefes大学の競技プログラミングの授業では、成績評価のために、$ N $ 回の試験を行うことにしています。 各試験での成績は、$ 0 $ 以上 $ M $ 以下の整数値です。 $ N $ 個の試験成績のうち、上位 $ K $ 個の平均が $ R $ 点以上であれば、めでたく単位が認定されます。 上位 $ K $ 個の平均が $ R $ 点未満の場合には不合格となり、単位は認定されません。
$ N-1 $ 回の試験を終えたヘイホー君は、最終試験に臨もうとしています。 最終試験を除く $ N-1 $ 回の試験におけるヘイホー君の成績は、それぞれ $ S_1 $, $ S_2 $, …, $ S_{N-1} $ 点でした。 ヘイホー君は、最終試験で何点以上取れば単位が認定されるでしょうか?
入力は以下の形式で標準入力から与えられる。
$ N $ $ K $ $ M $ $ R $ $ S_1 $ $ S_2 $ : $ S_{N-1} $
出力は $ 1 $ 行からなる。
いずれの場合も、出力の末尾には改行をいれること。
5 3 100 60
86
23
49
39
45
5 3 100 60
92
100
95
99
0
5 3 100 60
18
42
29
31
-1
13 10 1000000000 645245296
492014535
611893452
729291030
392019922
293849201
474839528
702912832
341845861
102495671
908590572
812912432
129855439
986132796
ヘイホー君が最終試験で $ 45 $ 点を取った場合、上位 $ 3 $ 個の平均は $ (86+49+45)/3=60 $ となり、単位が認定されます。 もちろん、$ 46 $ 点以上取っても単位は認定されます。 一方、$ 44 $ 点以下の場合には単位が認定されません。
最終試験で $ 0 $ 点でも単位が認定されます。
残念ながら、最終試験が満点でも単位は認定されません。
大きな数が入力されることもあります。オーバーフローに注意しましょう。
#include
#define ll long long
using namespace std;
const int maxn=100+10;
int n,k;
ll m,r,cnt;
ll a[maxn];
inline bool cmp(ll x,ll y){return x>y;}
int main(){
scanf("%d%d%lld%lld",&n,&k,&m,&r);
--n;
for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
sort(a+1,a+n+1,cmp);
for(int i=1;i<=k;i++)cnt+=a[i];
//printf("%lld\n",cnt);
ll op=(ll)k*r;
if(cnt>=op){
printf("0\n");
return 0;
}
if(k==n+1){
ll x=op-cnt;
if(x>m)printf("-1\n");
else printf("%lld\n",x);
return 0;
}
ll x=op-cnt+a[k];
if(x>m)printf("-1\n");
else printf("%lld\n",x);
return 0;
}