您的位置:首页 > 其它

USACO Section 4.2 Job Processing

2014-05-01 16:44 477 查看
题意:

n个工作  每个工作需要先进行A操作再进行B操作  有m1个A机器m2个B机器  每个机器有各自的加工时间  问  最短多长时间所有工作完成A操作  最短多长时间所有工作完成B操作

思路:

第一问贪心即可

根据机器的下一次可用时间和加工时间维护堆  每次拿一个工作给最快的机器做  最后会形成每个工作完成的时间

其中的最大值就是第一问答案

第二问二分答案(我的做法)

二分结束时间  然后O(nm2)的判断可否在该时间内完成

第二问依旧贪心(题解做法)

本题A和B操作唯一的不同就是  A操作时所有零件都可用  B操作时零件是按时间顺序一个一个过来的

但B操作完成时间是按最长时间的工作计算的  所以相当于好多个起点最后合在一个终点

因此我们可以将整个过程拆成两半将B操作翻过来

这样就是 零件进行A操作组装  成品进行反B操作拆卸  这时B也可以用A操作方式贪心求解

此时我们得到了A操作后所有零件的时间和B操作前所有零件的时间  现在是如何让它们一一对应的问题

易知  贪心的做  A中最小和B中最大对应  这样算出的最大值就是第二问答案

代码:(我的思路)

/*
ID: housera1
PROG: job
LANG: C++
*/
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
#define N 1010

int com
,add[50],vis
;
int n,m1,m2,ans;
struct node
{
int add,now;
bool operator<(const node fs) const
{
if(now!=fs.now) return now>fs.now;
return add>fs.add;
}
}x;
priority_queue<node> q;

bool ok(int x)
{
int i,j;
for(i=1;i<=m2;i++) vis[i]=x;
for(i=n;i;i--)
{
for(j=1;j<=m2;j++)
{
if(vis[j]>=com[i]+add[j])
{
vis[j]-=add[j];
break;
}
}
if(j>m2) return false;
}
return true;
}

int main()
{
int Debug=0;
if(!Debug)
{
freopen("job.in","r",stdin);
freopen("job.out","w",stdout);
}
int i,j,k;
scanf("%d%d%d",&n,&m1,&m2);
for(i=1;i<=m1;i++)
{
scanf("%d",&x.add);
x.now=x.add;
q.push(x);
}
for(i=1;i<=n;i++)
{
x=q.top();
q.pop();
com[i]=x.now;
x.now+=x.add;
q.push(x);
}
printf("%d ",com
);
for(i=1;i<=m2;i++) scanf("%d",&add[i]);
sort(add+1,add+1+m2);
for(i=n,k=99999999;i;i--)
{
if(!vis[i]&&com[i]+add[1]<=k)
{
k=com[i];
vis[i]=1;
}
}
for(i=1,j=0;i<=n;i++)
{
if(!vis[i]) j++;
}
j=j*add[1]+com
+add[1];
i=com
+add[1];
while(i<=j)
{
k=(i+j)/2;
if(ok(k))
{
ans=k;
j=k-1;
}
else i=k+1;
}
printf("%d\n",ans);
return 0;
}


代码:(题解思路)

/*
ID: housera1
PROG: job
LANG: C++
*/
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
#define N 1010

int com
,go
,vis
;
int n,m1,m2;
struct node
{
int add,now;
bool operator<(const node fs) const
{
if(now!=fs.now) return now>fs.now;
return add>fs.add;
}
}x;
priority_queue<node> q;

int main()
{
int Debug=0;
if(!Debug)
{
freopen("job.in","r",stdin);
freopen("job.out","w",stdout);
}
int i,j,k;
scanf("%d%d%d",&n,&m1,&m2);
for(i=1;i<=m1;i++)
{
scanf("%d",&x.add);
x.now=x.add;
q.push(x);
}
for(i=1;i<=n;i++)
{
x=q.top();
q.pop();
com[i]=x.now;
x.now+=x.add;
q.push(x);
}
printf("%d ",com
);
while(!q.empty()) q.pop();
for(i=1;i<=m2;i++)
{
scanf("%d",&x.add);
x.now=x.add;
q.push(x);
}
for(i=1;i<=n;i++)
{
x=q.top();
q.pop();
go[i]=x.now;
x.now+=x.add;
q.push(x);
}
for(i=1,j=n,k=-1;i<=n;i++,j--) k=max(k,com[i]+go[j]);
printf("%d\n",k);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: