AT_arc174_b [ARC174B] Bought Review 題解

whrwlx發表於2024-03-26

題目翻譯

針對 \(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;
}

無關的話(稽核大大,求過審):被禁言了,怎麼解啊?

感謝觀看!

相關文章