洗衣服和烘干衣服(优先队列+思维)

题意:

给你n件衣服,w个洗衣机,m个烘干机。

烘干必须等洗完了才能烘干,多台机器可以同时工作。

思路:

两次优先队列:烘干衣服那边的优先队列有点难想到,而且倒过来遍历:最后一件衣服尽量用快的烘干机烘干也不容易想到。

代码中有注释。

  1 #define IOS ios_base::sync_with_stdio(0); cin.tie(0);
  2 #include <cstdio>//sprintf islower isupper
  3 #include <cstdlib>//malloc  exit strcat itoa system("cls")
  4 #include <iostream>//pair
  5 #include <fstream>//freopen("C:\\Users\\13606\\Desktop\\草稿.txt","r",stdin);
  6 #include <bitset>
  7 //#include <map>
  8 //#include<unordered_map>
  9 #include <vector>
 10 #include <stack>
 11 #include <set>
 12 #include <string.h>//strstr substr
 13 #include <string>
 14 #include <time.h>//srand(((unsigned)time(NULL))); Seed n=rand()%10 - 0~9;
 15 #include <cmath>
 16 #include <deque>
 17 #include <queue>//priority_queue<int, vector<int>, greater<int> > q;//less
 18 #include <vector>//emplace_back
 19 //#include <math.h>
 20 //#include <windows.h>//reverse(a,a+len);// ~ ! ~ ! floor
 21 #include <algorithm>//sort + unique : sz=unique(b+1,b+n+1)-(b+1);+nth_element(first, nth, last, compare)
 22 using namespace std;//next_permutation(a+1,a+1+n);//prev_permutation
 23 #define fo(a,b,c) for(register int a=b;a<=c;++a)
 24 #define fr(a,b,c) for(register int a=b;a>=c;--a)
 25 #define mem(a,b) memset(a,b,sizeof(a))
 26 #define pr printf
 27 #define sc scanf
 28 #define ls rt<<1
 29 #define rs rt<<1|1
 30 typedef long long ll;
 31 void swapp(int &a,int &b);
 32 double fabss(double a);
 33 int maxx(int a,int b);
 34 int minn(int a,int b);
 35 int Del_bit_1(int n);
 36 int lowbit(int n);
 37 int abss(int a);
 38 //const long long INF=(1LL<<60);
 39 const double E=2.718281828;
 40 const double PI=acos(-1.0);
 41 const int inf=(1<<30);
 42 const double ESP=1e-9;
 43 const int mod=(int)1e9+7;
 44 const int N=(int)1e6+10;
 45 
 46 struct node
 47 {
 48     ll t,End;
 49     friend bool operator<(node a,node b)
 50     {
 51         return a.End>b.End;
 52     }
 53 };
 54 
 55 ll cloth[N];
 56 priority_queue<node> q;
 57 
 58 int main()
 59 {
 60 //    freopen("C:\\Users\\13606\\Desktop\\草稿.txt","r",stdin);
 61     int T,cont=0;
 62     sc("%d",&T);
 63     while(T--)
 64     {
 65         int n,W,H;
 66         sc("%d%d%d",&n,&W,&H);
 67         while(!q.empty())q.pop();
 68         for(int i=1;i<=W;++i)
 69         {
 70             ll t;
 71             sc("%lld",&t);
 72             q.push({t,t});
 73         }
 74         for(int i=1;i<=n;++i)//t表示再洗一件要花的时间;
 75         {                    // End是如果在用这个机器洗的话,洗完之后是什么时候;
 76             node temp=q.top();q.pop();
 77             cloth[i]=temp.End;
 78             q.push({temp.t,temp.End+temp.t});
 79         }
 80         while(!q.empty())q.pop();
 81         for(int i=1;i<=H;++i)
 82         {
 83             ll t;
 84             sc("%lld",&t);
 85             q.push({t,t});
 86         }
 87         ll ans=0;
 88         for(int i=n;i>=1;--i)//t表示再洗一件要花的时间;
 89         {                    // End表示如果再用这台机器洗的话会花多久;
 90             node temp=q.top();q.pop();//而且我们发现,对于这件衣服,就算后面一件衣服同样也用了
 91             ans=max(ans,cloth[i]+temp.End);//这一台洗衣机的话,无论是否交错(需要等待)
 92             q.push({temp.t,temp.End+temp.t});//都会花去TIME_sum+t的时间;
 93         }
 94         pr("Case #%d: %lld\n",++cont,ans);
 95     }
 96     return 0;
 97 }
 98 
 99 /**************************************************************************************/
100 
101 int maxx(int a,int b)
102 {
103     return a>b?a:b;
104 }
105 
106 void swapp(int &a,int &b)
107 {
108     a^=b^=a^=b;
109 }
110 
111 int lowbit(int n)
112 {
113     return n&(-n);
114 }
115 
116 int Del_bit_1(int n)
117 {
118     return n&(n-1);
119 }
120 
121 int abss(int a)
122 {
123     return a>0?a:-a;
124 }
125 
126 double fabss(double a)
127 {
128     return a>0?a:-a;
129 }
130 
131 int minn(int a,int b)
132 {
133     return a<b?a:b;
134 }

 

posted @ 2019-09-03 20:34  ZMWLxh  阅读(281)  评论(0编辑  收藏  举报