华电北风吹
天津大学认知计算与应用重点实验室
日期:2015/12/5
题目链接:
http://nanti.jisuanke.com/t/430
题目类型:
枚举
题目描述:
爱奇艺制作四档节目 W, X, Y, Z;能用的演播室只有A 和B。W 每一期都要在A 来录制,X每一期都固定在 B 来录制。而 Y 和 Z 没有特别的要求,既可以在演播室 A 录制。 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,z即可。在简化一下只考虑y在A,B之间的分配即可(z用来均衡时间)。
参考代码:
#include <iostream>
#include <fstream>
using namespace std;
#define MAX 0x7fffffff
int main()
{
int T;
int count[4], time[4], time_A, time_B, leasttime;
cin >> T;
while (T--)
{
time_A = 0;
time_B = 0;
leasttime = MAX;
for (int i = 0; i<4; i++)
cin >> count[i];
for (int i = 0; i<4; i++)
cin >> time[i];
for (int i = 0; i <= count[2]; i++)
{
time_A = count[0] * time[0] + i*time[2];
time_B = count[1] * time[1] + (count[2] - i)*time[2];
int min = time_A<time_B ? time_A : time_B;
int max = time_A>time_B ? time_A : time_B;
int temp;
if (min + count[3] * time[3] > max)
{
int need = (max - min) / time[3];
int left = count[3] - need;
if ((left & 1) == 0)
temp = max + (left >> 1)*time[3];
else
temp = min + (need + (left >> 1) + 1)*time[3];
}
else
temp = max;
leasttime = leasttime<temp ? leasttime : temp;
}
cout << leasttime << endl;
}
}