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
,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;
}
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;
}
相关文章推荐
- USACO-Section 4.2 Job Processing (贪心)
- Job Processing_usaco4.2_贪心
- USACO Section 4.2: Drainage Ditches
- USACO Section 4.2 Cowcycles - 枚举~
- USACO Section 4.2: The Perfect Stall
- USACO 4.2 job processing
- USACO 4.2 Job Processing(贪心)
- usaco 4.2 Job Processing(贪心)
- usaco 4.2 Job Processing 贪心
- USACO Section 4.2 Drainage Ditches - 复习网络流
- 4.2 原理图的设计
- C++——USACO Section 2.2 题解
- 挑战程序竞赛系列(48):4.2 推理与动态规划算法(1)
- P2740 [USACO4.2]草地排水Drainage Ditches
- Geosoft Oasis Montaj v6.4.2_USB加密锁运行稳定版\
- xcode4.2 完成输入后关闭键盘
- 习题4.2
- 洛谷P1894 [USACO4.2]完美的牛栏The Perfect Stall
- Extjs4.2 布局详解—Card布局
- extjs4.2 from表单创建、窗口设置、显示