计蒜客—爱奇异的自制节目

华电北风吹
天津大学认知计算与应用重点实验室
日期: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;
    }
}

你可能感兴趣的:(计蒜客—爱奇异的自制节目)