[ARC174B] Bought Review 题解

【题目描述】

你开了一家店,有 \(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;
}
posted @ 2024-03-20 21:53  Sundar_2022  阅读(18)  评论(0)    收藏  举报