洛谷题解 CF991B 【Getting an A】

题意简述:

给你几门测试的成绩,问你最少要重测几门才能使平均成绩四舍五入为5分

解题思路:

其实就是贪心的思想,而且要用到万恶的$sort$(图个方便)

根据我们的生活经验,很容易就能想到先把差的重测

又因为题目中有最少的字眼,故我们可以假设重测后就能满分(实际上几乎不可能,但是我们要作为理想状态考虑)

是不是有人看到四舍五入就头痛了

这里提供一种简便的方法:

所有数据扩大十倍,这样原来的十分位就变成了个位

然后你就可以直接处理了

我的代码没有用整除,取而代之的是乘法(这是有好处的)

显然$sum/n \geq 45$和$n*45 \leq sum$等价

代码实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;

int n,src[110],sum;

int main()
{
scanf("%d",&n);
for(int a=1;a<=n;++a)
{
scanf("%d",&src[a]);
src[a]=src[a]*10;//扩大十倍
sum=sum+src[a];//累加记录总分
}
sort(src+1,src+n+1);
int cot=0;
while(n*45>=sum)//判断是否满足题目条件
{
cot++;//统计重测次数
sum=sum-src[cot]+50;//把当前最低分改为满分重新计入总分
}
printf("%d\n",cot);
return 0;
}

题目详见:https://www.luogu.com.cn/problem/CF991B