洗衣服和烘干衣服(优先队列+思维)
题意:
给你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 }