一道贪心题,也是自己比较缺少的一种思想,在这里跟大家分享一下。
题目链接:https://vjudge.net/problem/HDU-6000
题目大意:熊猫先生洗衣服,有L件衣服,N件洗衣机,M件甩干机,且一台机器里只能有一件衣服,问你洗完衣服最短的时间。
这道题有两部分第一部分是在洗衣机里洗,第二部分是在甩干机里进行处理。
第一部分实现的是每件衣服洗完后的时间,而第二部分则实现全部洗完后的时间,这里主要提一下第二部分,把最快的部分给最后洗完的衣服(这是这道题核心的贪心思想),因为前面早洗完的甩干势必要等最后洗完的甩干,这样才是最后的完成时间,所以我们从后往前遍历,将最短时间的甩干机赋给最后一件衣服,并在过程中取最大值,因为其余衣服的所用时间必定包含在这个最长的时间中。
感觉这种思想是大部分人所缺少的,希望可以自己和大家重视!
下面给出AC代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e6+10;
struct node
{
ll v,base;
bool operator <(const node& s) const
{
return v>s.v;
}
};
ll c[maxn];
priority_queue<node> q1,q2;
int main()
{
std::ios::sync_with_stdio(false);
int T; scanf("%d",&T);
for(int kase=1;kase<=T;kase++)
{
memset(c,0,sizeof(c));
while(!q1.empty()) q1.pop();
while(!q2.empty()) q2.pop();
int L,N,M; scanf("%d %d %d",&L,&N,&M);
for(int i=0;i<N;i++)
{
ll t; scanf("%lld",&t);
q1.push(node{t,t});
}
for(int i=0;i<M;i++)
{
ll t; scanf("%lld",&t);
q2.push(node{t,t});
}
for(int i=0;i<L;i++)
{
node t=q1.top(); q1.pop();
c[i]=t.v;
t.v+=t.base;
q1.push(t);
}
ll ans=0;
for(int i=L-1;i>=0;i--)
{
node t=q2.top(); q2.pop();
ans=max(ans,t.v+c[i]);
t.v+=t.base;
q2.push(t);
}
printf("Case #%d: %lld\n",kase,ans);
}
return 0;
}