记录编号 76956 评测结果 AAAAAAAAAAAA
题目名称 工序安排 最终得分 100
用户昵称 Gravatarcstdio 是否通过 通过
代码语言 C++ 运行时间 0.008 s
提交时间 2013-10-31 20:45:57 内存使用 0.46 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
const int SIZEM=38;
const int SIZET=1000*40+1;
int n,m1,m2;
int atime[SIZEM]={0};
int btime[SIZEM]={0};
int max_pro[SIZET]={0};
int maxtime;
void read(void){
	scanf("%d%d%d",&n,&m1,&m2);
	int i;
	for(i=1;i<=m1;i++) scanf("%d",&atime[i]);
	for(i=1;i<=m2;i++) scanf("%d",&btime[i]);
	maxtime=n*40;
}
bool check_a(int limit){
	int i;
	int sum=0;
	for(i=1;i<=m1;i++){
		sum+=limit/atime[i];
		if(sum>=n) return true;
	}
	return false;
}
bool check_b(int limit){
	int i,j,k;
	int now_use[SIZET]={0};
	int sum=0;
	for(i=1;i<=m2;i++){
		j=k=limit-btime[i]+1;
		if(k<=0) continue;
		while(true){
			while(k>=0&&now_use[k]>=max_pro[k]) k--;
			if(k<0) break;
			sum++;
			now_use[k]++;
			if(sum>=n) return true;
			j-=(btime[i]);
			k=j;
		}
	}
	return false;
}
void get_pro(void){
	int i,j;
	for(i=1;i<=m1;i++){
		for(j=atime[i]+1;j<SIZET;j+=atime[i]) max_pro[j]++;
	}
}
int find_a(int left,int right){
	if(left==right) return left;
	int mid=(left+right)>>1;
	if(check_a(mid)) return find_a(left,mid);
	else return find_a(mid+1,right);
}
int find_b(int left,int right){
	if(left==right) return left;
	int mid=(left+right)>>1;
	if(check_b(mid)) return find_b(left,mid);
	else return find_b(mid+1,right);
}
int main(){
	freopen("jobus.in","r",stdin);
	freopen("jobus.out","w",stdout);
	read();
	get_pro();
	printf("%d ",find_a(1,maxtime/2));
	printf("%d\n",find_b(1,maxtime));
	return 0;
}