題目翻譯
針對 \(T\) 個測試用例解決以下問題:
在美食評論網站 EatCocoder
上,你可以評論餐廳的星級(從 \(1\) 到 \(5\) 的整數)。
最初,由廚師長 \(B\) 管理的餐廳有 \(A_i\) 條 \(i\) 星級評價。( \(1 ≤ i ≤ 5\) )
廚師可以向 EatCocoder
管理部門 行賄 提供 \(P_i\) 日元,以獲得一次 額外 的 \(i\) 星評論。( \(1 ≤ i ≤ 5\) )
透過賄賂新增總共 \(k\) 條評論後,將有 \(A_1+A_2+A_3+A_4+A_5+k\) 條評論。
廚師 \(B\) 希望這些評論的平均評分至少為三星。
請求出實現這一目標所需的最低 賄賂 消費總額。
演算法
法一(暴力)
不會寫暴力了,嗚嗚嗚…
法二(正解)
首先,如果平均分就 \(≥3\) ,顯然答案為 \(0\) 。
然後—我們可以發現一個 人類智慧 最佳化:
我們每增加一條評論,那麼應新增的星數就加 \(3\) ,
那麼為了補回星數,我們只能選擇比 \(3\) 大的,即 \(4\) 和 \(5\) 。
我們可以貪心:
- 全買 \(4\) 分的
- 買 \(1\) 個 \(4\) 分的和一些 \(5\) 分的
- 全買 \(5\) 分的
#include<bits/stdc++.h>
#define int long long
#define fd(i,a,b) for(int i=a;i<=b;i=-~i)
using namespace std;
int n,c,T,a[300100],f[2500],p[300100],ans=-1,cnt,sum;
signed main()
{
ios::sync_with_stdio(0);
cin>>T;
while(T--)
{
cnt=sum=0;
ans=1e18;
fd(i,1,5) cin>>a[i],cnt+=a[i]*3,sum+=a[i]*i;
fd(i,1,5) cin>>p[i];
if(sum>=cnt)//平均分≥3
{
cout<<0<<endl;
continue;
}
if((cnt-sum)%2)
ans=min(ans,min(((cnt-sum)/2+1)*p[5],((cnt-sum)/2)*p[5]+p[4]));
//買1個4分的和一些5分的/全買5分的
if((cnt-sum)%2==0)
ans=min(ans,((cnt-sum)/2)*p[5]);
//全買5分的
ans=min(ans,(cnt-sum)*p[4]);
//全買4分的
cout<<ans<<endl;
}
return 0;
}
無關的話(稽核大大,求過審):被禁言了,怎麼解啊?
感謝觀看!