【题目描述】
你开了一家店,有 \(A_i\) 个 \(i\) 星级评论,你可以花费 \(P_i\) 元买到一个 \(i\) 星评论,问使得这家店评论的星星平均值不小于 \(3\),最少要花多少钱。
\(1\le i \le 5\)。
【思路】
-
首先读入,判断平均值是否小于 \(3\),如果大于等于,直接输出 \(0\)
-
然后根据 \(3\times(当前的评论数)\) 算出平均值为 \(3\) 时,应该有多少个星星,还差多少个星星。
-
然后买 \(1,2,3\) 星的评论一定是没有用的。
-
现在问题转化为:
你现在要攒 \(n\) 个星星,可以花费 \(P_4\) 元买到 \(1\) 个星星,也可以花费 \(P_5\) 元买到 \(2\) 个星星
-
分类讨论:
- 首先,如果 \(P_4\times2\le P_5\)(一个一个买比一次买两个性价比高/一样),那么直接买就行。
- 否则,先两个两个买,然后最后如果有剩下的就再买一个。
做完了。
【Code】
#include <bits/stdc++.h>
#define int long long
using namespace std;
int T,A[6],P[6],Point;
void Main()
{
for(int i=1;i<=5;i++) scanf("%lld",&A[i]);
for(int i=1;i<=5;i++) scanf("%lld",&P[i]);
Point=3*(A[1]+A[2]+A[3]+A[4]+A[5])-(A[1]*1+A[2]*2+A[3]*3+A[4]*4+A[5]*5);
if(Point<=0){ //不需要贿赂
puts("0");
}else{
if(P[4]*2<=P[5]){ //算性价比
printf("%lld\n",Point*P[4]); //不如一个一个贿赂
}else{
if(Point%2==0) printf("%lld\n",Point*P[5]/2); //两个两个贿赂
else printf("%lld\n",(Point-1)*P[5]/2+min(P[4],P[5])); //两个两个贿赂,多一个
}
}
}
signed main()
{
scanf("%lld",&T);
while(T--){
Main();
}
return 0;
}
标签:星星,le,平均值,int,题解,Review,评论,ARC174B
From: https://www.cnblogs.com/Sundar-2022/p/18086193