爱奇艺作为一家视频网站巨头,要为上亿的用户每天都提供“悦享品质”的服务。除了引进一些优秀的影视作品外,爱奇艺还做了一些诸如奇葩说、晓松奇谈的自制节目。爱奇艺最近又准备制作四档新的节目,它们分别是 W, X, Y, Z;但是现在能用来录这些节目的演播室只有两个,分别是演播室 A 和演播室 B。
W 节目的现场搭建比较复杂,每一期都要在演播室 A 来录制,X 节目的摄影机位调整会影响节目质量,每一期都固定在演播室 B 来录制。而节目 Y 和节目 Z 的搭建都比较容易移动,摄影也没有特别的要求,既可以在演播室 A 录制,也可以在演播室 B 录制。
已知 W 节目一共 Ew 期,每期录制需要 w 分钟;X 节目一共 Ex 期,每期录制需要 x 分钟;Y 节目一共 Ey 期,每期录制需要 y 分钟;Z 节目一共 Ez 期,每期录制需要 z 分钟。
每一期节目从开始到结束必须在同一个演播室内录制,而整个节目不必每一期都在同一个演播室内录制。现在爱奇艺希望在最短时间内在这两个演播室内将四档节目录制完成,在节目都连续录制的假设下,你能帮他们算出将节目全部录制完成所需的最短时间么?
输入格式
第一行输入一个整数 T (1 ≤ T ≤ 50),表示数据组数。
接下来一共输入 T 行数据,每行输入一组 8 个整数 Ew, Ex, Ey, Ez, w, x, y, z (1 ≤ Ew, Ex, Ey, Ez, w, x, y, z ≤ 106)。
输出格式
输出 T 行,每行一个整数,表示该组四档节目在连续录制的假设下,全部录完所需要的最短时间。
样例输入
1 100 1 3 5 10 1 10 10
样例输出
1000
解题思路
只需要枚举一下y在A演播室的天数,接着贪心求就行了
#include <bits/stdc++.h>
#define INF 1ll<<60
using namespace std;
typedef long long ll;
ll E[10],t[10];
int main(){
int T;
scanf("%d",&T);
while(T--){
for(int i = 1; i <= 4; ++i){
scanf("%d",&E[i]);
}
for(int i = 1; i <= 4; ++i){
scanf("%d",&t[i]);
}
ll t1 = E[1] * t[1],t2 = E[2] * t[2];
if(t[3] < t[4]){
swap(E[3],E[4]);
swap(t[3],t[4]);
}
ll ans = INF;
for(int i = 0; i <= E[3]; ++i){
ll ta = t1 + i * t[3],tb = t2 + (E[3] - i) * t[3];//枚举y
//cout<<"ta = "<<ta<<endl;
//cout<<"tb = "<<tb<<endl;
ll sum;
if(ta > tb){
swap(ta,tb);
}
ll tmp = (tb - ta) / t[4];//t[4]需要多少分钟才能追上节目时间长的
//cout<<"tmp = "<<tmp<<endl;
if(E[4] <= tmp){
sum = tb;
}else{
ta += tmp * t[4];
ll left = E[4] - tmp;//剩下的
if(left % 2 == 1){
sum = ta + (left / 2 + 1) * t[4];
}else{
sum = tb + left / 2 * t[4];
}
}
ans = min(ans,sum);
}
printf("%lld\n",ans);
}
return 0;
}