直接从小往大枚举,贪心用结束时间最早的洗衣机和烘干机去洗,然后可以得到每一件衣服洗完的时间和烘干的时间
然后由于顺序任意,配对肯定是逆序,即最早的洗完时间配最晚的烘干时间,相加取max即可
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define ll long long 4 priority_queue<pair<ll,int> >q; 5 pair<ll,int>o; 6 int t,k,n,m,x; 7 ll ans,d[2][1000005]; 8 int main(){ 9 scanf("%d",&t); 10 for(int ii=1;ii<=t;ii++){ 11 scanf("%d%d%d",&k,&n,&m); 12 ans=0; 13 for(int i=0;i<2;i++){ 14 while (!q.empty())q.pop(); 15 for(int j=1;j<=n;j++){ 16 scanf("%d",&x); 17 q.push(make_pair(-x,x)); 18 } 19 for(int j=1;j<=k;j++){ 20 o=q.top(); 21 q.pop(); 22 d[i][j]=-o.first; 23 o.first-=o.second; 24 q.push(o); 25 } 26 swap(n,m); 27 } 28 for(int i=1;i<=k;i++)ans=max(ans,d[0][i]+d[1][k-i+1]); 29 printf("Case #%d: %lld\n",ii,ans); 30 } 31 }