2015 计蒜之道 初赛(4)爱奇艺的自制节目(枚举 贪心)

时间:2022-05-07
本文章向大家介绍2015 计蒜之道 初赛(4)爱奇艺的自制节目(枚举 贪心),主要内容包括爱奇艺的自制节目、下面给出AC代码:、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。

爱奇艺的自制节目

爱奇艺作为一家视频网站巨头,要为上亿的用户每天都提供“悦享品质”的服务。除了引进一些优秀的影视作品外,爱奇艺还做了一些诸如奇葩说、晓松奇谈的自制节目。爱奇艺最近又准备制作四档新的节目,它们分别是 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

题目链接:https://nanti.jisuanke.com/t/430

解题思路:

暴力枚举节目Y在A演播室的天数,然后贪心。

注意INF的取值。

下面给出AC代码:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 #define INF 1ll<<60
 5 int main()
 6 {
 7     ll T;
 8     while(scanf("%lld",&T)!=EOF)
 9     {
10         while(T--)
11         {
12             ll Ew,Ex,Ey,Ez,w,x,y,z;
13             cin>>Ew>>Ex>>Ey>>Ez>>w>>x>>y>>z;
14             ll tw=Ew*w;
15             ll tx=Ex*x;
16             if(y<z)
17             {
18                 swap(Ey,Ez);
19                 swap(y,z);
20             }
21             ll ans=INF;
22             for(ll i=0;i<=Ey;i++)
23             {
24                 ll ta=tw+i*y;
25                 ll tb=tx+(Ey-i)*y;
26                 ll sum;
27                 if(ta>tb)
28                     swap(ta,tb);
29                 ll tmp=(tb-ta)/z;
30                 if(Ez<=tmp)
31                     sum=tb;
32                 else
33                 {
34                     ta+=tmp*z;
35                     ll left=Ez-tmp;
36                     if(left%2==1)
37                         sum=ta+((left+1)/2)*z;
38                     else sum=tb+left/2*z;
39                 }
40                 ans=min(ans,sum);
41             }
42             printf("%lldn",ans);
43         }
44     }
45     return 0;
46 }