[HNOI2011]任务调度
题目描述
有 N 个任务和两台机器 A 与 B。每个任务都需要既在机器 A 上执行,又在机器 B 上执行,
第 i 个任务需要在机器 A 上执行时间 Ai,且需要在机器 B 上执行时间 Bi。最终的目标是所有任务在 A 和 B 上都执行完,且希望执行完所有任务的总时间尽量少。当然问题没有这么简单,有些任务对于先在机器 A 上执行还是先在机器 B 上执行有一定的限制。据此可将所有任务分为三类:
任务必须先在机器 A 上执行完然后再在机器 B 上执行。
任务必须先在机器 B 上执行完然后再在机器 A 上执行。
- 任务没有限制,既可先在机器 A 上执行,也可先在机器 B 上执行。
现在给定每个任务的类别和需要在机器A和机器B上分别执行的时间,问使所有任务都能按
规定完成所需要的最少总时间是多少。
输入输出格式
输入格式:
从文件input.txt中读入数据,输入文件的第一行只有一个正整数N(1≤N≤20),表示任务的个数。接下来的N行,每行是用空格隔开的三个正整数Ti,
Ai, Bi(1≤Ti≤3, 1≤Ai, Bi≤1000),分别表示第i个任务的类别(类别1, 2,
3的定义如上)以及第i个任务需要在机器A和机器B上分别执行的时间。
输出格式:
输出文件 output.txt 仅包含一个正整数,表示所有任务都执行完所需要的最少总时
输入输出样例
说明
样例解释:一种最优任务调度方案为:机器A上执行的各任务依次安排如下:任务1(0 - 5), 任务2(5 - 11), 任务3(11 - 13);机器B上执行的各任务依次安排如下:任务3(0 - 6), 任务 1(6 - 13), 任务2(13 - 14),这样,所有任务都执行完所需要的总时间为14。
先用搜索枚举出第3类,分别分到1或2类
然后排序贪心
对于先要在a机器上运行的任务以需要在b机器上运行时间作为第一关键字,在a机器上运行时间作为第二关键字排序(为什么那种b机器上耗时比较多的放在最后面可能会让b机器运行很久)
但这只有90分,贪心并不一定正确
于是可以随机算法,每次随机交换1类两个元素和2类两个元素,看答案是否更优
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<ctime>
using namespace std;
struct ZYYS
{
int a,b;
}A[],B[],C[],AA[],BB[];
int cntb,cnta,cntc,ans,t,n;
bool cmpa(ZYYS u,ZYYS v)
{
if (u.a==v.a) return u.b<v.b;
return u.a>v.a;
}
bool cmpb(ZYYS u,ZYYS v)
{
if (u.b==v.b) return u.a<v.a;
return u.b>v.b;
}
int cal()
{int ta,tb,res,i;
ta=;tb=;
for (i=;i<=cntb;i++)
tb+=BB[i].b;
for (i=;i<=cnta;i++)
{
ta+=AA[i].a;
if (ta<tb) tb+=AA[i].b;
else tb=ta+AA[i].b;
}
res=tb;
ta=;tb=;
for (i=;i<=cnta;i++)
ta+=AA[i].a;
for (i=;i<=cntb;i++)
{
tb+=BB[i].b;
if (tb<ta) ta+=BB[i].a;
else ta=tb+BB[i].a;
}
res=max(res,ta);
return res;
}
void check()
{int i,tmp,a1,a2,b1,b2;
for (i=;i<=cnta;i++)
AA[i]=A[i];
for (i=;i<=cntb;i++)
BB[i]=B[i];
sort(AA+,AA+cnta+,cmpb);
sort(BB+,BB+cntb+,cmpa);
tmp=cal();
ans=min(ans,tmp);
for (i=;i<=t;i++)
{
if (cnta)
{
a1=rand()%cnta+,a2=rand()%cnta+;
if (a1==a2) a2=rand()%cnta+;
swap(AA[a1],AA[a2]);
}
if (cntb)
{
b1=rand()%cntb+,b2=rand()%cntb+;
if (b1==b2) b2=rand()%cntb+;
swap(BB[b1],BB[b2]);
}
tmp=cal();
if (tmp<=ans) {ans=tmp;continue;}
if (cnta)swap(AA[a1],AA[a2]);
if (cntb)swap(BB[b1],BB[b2]);
}
}
void dfs(int x)
{
if (x>cntc)
{
check();
return;
}
cnta++;A[cnta]=C[x];
dfs(x+);
cnta--;
cntb++;B[cntb]=C[x];
dfs(x+);
cntb--;
}
int main()
{int i,x,y,opt;
cin>>n;
srand(time());
for (i=;i<=n;i++)
{
scanf("%d",&opt);
scanf("%d%d",&x,&y);
if (opt==)
{
A[++cnta].a=x;A[cnta].b=y;
}
else if (opt==)
{
B[++cntb].a=x;B[cntb].b=y;
}
else C[++cntc].a=x,C[cntc].b=y;
}
t=;
ans=2e9;
dfs();
cout<<ans;
}
[HNOI2011]任务调度的更多相关文章
- 2336: [HNOI2011]任务调度 - BZOJ
一道随机算法的题目 随便用什么随机算法 首先我们可以想到枚举类型3的最终类型,然后再做 先贪心出一个较优的序列,首先我们知道肯定是在A机器上先做完类型1的事件再做类型2的事件,机器B也类似,因为这些没 ...
- bzoj2336 [HNOI2011]任务调度
Description 正解:搜索+随机化. 先写个搜索,枚举所有没有要求的任务属于哪一种任务,然后再用爬山来更新最优解. 具体来说就是先把所有先做任务$A$的按照$a$时间从大到小排序,先做任务$B ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- .net 分布式架构之任务调度平台
开源地址:http://git.oschina.net/chejiangyi/Dyd.BaseService.TaskManager .net 任务调度平台 用于.net dll,exe的任务的挂载, ...
- 免费开源的DotNet任务调度组件Quartz.NET(.NET组件介绍之五)
很多的软件项目中都会使用到定时任务.定时轮询数据库同步,定时邮件通知等功能..NET Framework具有“内置”定时器功能,通过System.Timers.Timer类.在使用Timer类需要面对 ...
- Spring Quartz实现任务调度
任务调度 在企业级应用中,经常会制定一些"计划任务",即在某个时间点做某件事情 核心是以时间为关注点,即在一个特定的时间点,系统执行指定的一个操作 任务调度涉及多线程并发.线程池维 ...
- Quartz实现任务调度
一.任务调度概述 在企业级应用中,经常会制定一些"计划任务",即在某个时间点做某件事情,核心是以时间为关注点,即在一个特定的时间点,系统执行指定的一个操作,任务调度涉及多线程并发. ...
- 基于ASP.NET MVC(C#)和Quartz.Net组件实现的定时执行任务调度
http://www.cnblogs.com/bobositlife/p/aspnet-mvc-csharp-quartz-net-timer-task-scheduler.html 在之前的文章&l ...
- Quartz任务调度基本使用
转自:http://www.cnblogs.com/bingoidea/archive/2009/08/05/1539656.html 上一篇:定时器的实现.Java定时器Timer和Quartz介绍 ...
随机推荐
- HIVE的常用操作(HQL)语句
HIVE基本操作命令 创建数据库 >create database db_name; >create database if not exists db_name;//创建一个不存在的数据 ...
- 用C语言实现QQ刷屏
我在百度传课上录制了一个用C语言实现刷屏的视频,有兴趣的可以移步这边:https://chuanke.baidu.com/6658388-238008.html
- Beta敏捷冲刺每日报告——Day3
1.情况简述 Beta阶段Scrum Meeting 敏捷开发起止时间 2017.11.4 00:00 -- 2017.11.5 00:00 讨论时间地点 2017.11.4 晚9:30,电话会议会议 ...
- djangoueditor 集成xadmin
1.安装Python3兼容版本 https://github.com/twz915/DjangoUeditor3/ 2.model加入字段 from DjangoUeditor.models impo ...
- fflush(stdin)与fflush(stdout)
1.fflush(stdin): 作用:清理标准输入流,把多余的未被保存的数据丢掉.. 如: int main() { int num; char str[10]; cin>>num; c ...
- 201621123027 Week02-Java基本语法与类库
Week02-Java基本语法与类库 1.本周学习总结 关键词:基本语法,数据类型,包装类 本周讲了Java的基本数据类型和包装类: 数据类型主要分为八类(byte,short,int,long,do ...
- 一个CSS简单入门网站
讲的知识简单明了,很实用: http://zh.learnlayout.com/
- Document Object Model
什么是DOM W3C制定的书写HTML分析器的标准接口规范 全称 Document Object Model 文档对象模型DOM为HTML文档提供的一个API(接口) 可以操作HTML文档 <! ...
- php的打印sql语句的方法
echo M()->_sql(); 这样就可以调试当前生成的sql语句: //获取指定天的开始时间和结束时间 $datez="2016-05-12"; $t = strtot ...
- 判断一个字符串是不是一个合法的IP地址
最近在笔试的时候遇到碰一道算法题, 要求判断一个字符串是不是合法的ip地址. 将我的思路发出来分享一下,不一定正确,也不一定是最优的方法.希望能分享一些交流 要求用java或者c来实现,我的java代 ...