2018.10.27 loj#6035. 「雅禮集訓 2017 Day4」洗衣服(貪心+堆)
阿新 • • 發佈:2018-10-31
傳送門
顯然的貪心題啊。。。考試沒調出來10pts滾了妙的一啊
直接分別用堆貪心出洗完第
件衣服需要的最少時間和晾完第
件衣服需要的最少時間。
我們設第一個算出來的陣列是
,第二個是
,然後令
陣列是
的一個任意排列。
於是要求
{
{
}}
裡面東西跟排序不等式很像啊 ,於是
正序
倒序加起來取最大值就行了。
程式碼:
#include<bits/stdc++.h>
using namespace std;
inline int read(){
int ans=0;
char ch=getchar();
while(!isdigit(ch))ch=getchar();
while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
return ans;
}
const int N=1e6+5;
int L,n,m;
typedef long long ll;
ll a[N],b[N],t1[N],t2[N],ans=0;
int main(){
L=read(),n=read(),m=read();
priority_queue<pair<ll,ll>,vector<pair<ll,ll> >,greater<pair<ll,ll> > >q1,q2;
for(int i=1,v;i<=n;++i)q1.push(make_pair(v=read(),v));
for(int i=1,v;i<=m;++i)q2.push(make_pair(v=read(),v));
for(int i=1;i<=L;++i){
pair<ll,ll>tmp=q1.top();
q1.pop();
t1[i]=tmp.first,tmp.first+=tmp.second,q1.push(tmp);
tmp=q2.top();
q2.pop();
t2[i]=tmp.first,tmp.first+=tmp.second,q2.push(tmp);
}
for(int i=1;i<=L;++i)ans=max(ans,t1[i]+t2[L-i+1]);
cout<<ans;
return 0;
}