题目描述

有 N 个任务和两台机器 A 与 B。每个任务都需要既在机器 A 上执行,又在机器 B 上执行,

第 i 个任务需要在机器 A 上执行时间 Ai,且需要在机器 B 上执行时间 Bi。最终的目标是所有任务在 A 和 B 上都执行完,且希望执行完所有任务的总时间尽量少。当然问题没有这么简单,有些任务对于先在机器 A 上执行还是先在机器 B 上执行有一定的限制。据此可将所有任务分为三类:

  1. 任务必须先在机器 A 上执行完然后再在机器 B 上执行。

  2. 任务必须先在机器 B 上执行完然后再在机器 A 上执行。

  3. 任务没有限制,既可先在机器 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 仅包含一个正整数,表示所有任务都执行完所需要的最少总时

输入输出样例

输入样例#1:
复制

3
3 5 7
1 6 1
2 2 6
输出样例#1: 复制

14

说明

样例解释:一种最优任务调度方案为:机器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]任务调度的更多相关文章

  1. 2336: [HNOI2011]任务调度 - BZOJ

    一道随机算法的题目 随便用什么随机算法 首先我们可以想到枚举类型3的最终类型,然后再做 先贪心出一个较优的序列,首先我们知道肯定是在A机器上先做完类型1的事件再做类型2的事件,机器B也类似,因为这些没 ...

  2. bzoj2336 [HNOI2011]任务调度

    Description 正解:搜索+随机化. 先写个搜索,枚举所有没有要求的任务属于哪一种任务,然后再用爬山来更新最优解. 具体来说就是先把所有先做任务$A$的按照$a$时间从大到小排序,先做任务$B ...

  3. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  4. .net 分布式架构之任务调度平台

    开源地址:http://git.oschina.net/chejiangyi/Dyd.BaseService.TaskManager .net 任务调度平台 用于.net dll,exe的任务的挂载, ...

  5. 免费开源的DotNet任务调度组件Quartz.NET(.NET组件介绍之五)

    很多的软件项目中都会使用到定时任务.定时轮询数据库同步,定时邮件通知等功能..NET Framework具有“内置”定时器功能,通过System.Timers.Timer类.在使用Timer类需要面对 ...

  6. Spring Quartz实现任务调度

    任务调度 在企业级应用中,经常会制定一些"计划任务",即在某个时间点做某件事情 核心是以时间为关注点,即在一个特定的时间点,系统执行指定的一个操作 任务调度涉及多线程并发.线程池维 ...

  7. Quartz实现任务调度

    一.任务调度概述 在企业级应用中,经常会制定一些"计划任务",即在某个时间点做某件事情,核心是以时间为关注点,即在一个特定的时间点,系统执行指定的一个操作,任务调度涉及多线程并发. ...

  8. 基于ASP.NET MVC(C#)和Quartz.Net组件实现的定时执行任务调度

    http://www.cnblogs.com/bobositlife/p/aspnet-mvc-csharp-quartz-net-timer-task-scheduler.html 在之前的文章&l ...

  9. Quartz任务调度基本使用

    转自:http://www.cnblogs.com/bingoidea/archive/2009/08/05/1539656.html 上一篇:定时器的实现.Java定时器Timer和Quartz介绍 ...

随机推荐

  1. 关于hadoop集群下Datanode和Namenode无法访问的解决方案

    HDFS架构 HDFS也是按照Master和Slave的结构,分namenode,secondarynamenode,datanode这几个角色. Namenode:是maseter节点,是大领导.管 ...

  2. C语言博客作业--数组

    一.PTA实验作业 题目1.求整数序列中出现次数最多的数 1.本题PTA提交列表 2.设计思路 定义整形变量n,max,count分别表示整数个数,出现次数最大值,出现次数.定义循环变量i,j. 输入 ...

  3. 随机ID添加

    var http = require("http"); var fs = require("fs"); var server = http.createServ ...

  4. rcnn fast-rcnn faster-rcnn资料

    ---恢复内容开始--- 框架:https://github.com/rbgirshick 论文:链接: https://pan.baidu.com/s/1jIoChxG 密码: ubgm faste ...

  5. JAVA_SE基础——61.字符串入门

    public class Demo1 { public static void main(String[] args) { String str1 = "hello"; Strin ...

  6. Spring Boot整合Spring Security

    Spring Boot对于该家族的框架支持良好,但是当中本人作为小白配置还是有一点点的小问题,这里分享一下.这个项目是使用之前发布的Spring Boot会员管理系统重新改装,将之前filter登录验 ...

  7. 微信接口(一)创建菜单&自动回复

    刚划拉完微信.做一个笔记这里的数据是写死的,还有一份是通过查询数据库进行自动回复,自定义菜单设置的.不过因为使用到数据库,最好在网站后台吧微信平台开发集成进去.所以代码较多就先不放了.有问题的地方请留 ...

  8. LXC学习实践(2)安装LXC

    1.准备工作: yum install gcc yum install libcap-devel yum install libcgroup 2.安装LXC 下载源代码:sourceforge.net ...

  9. MySql查询正在进行中的事务

    用法 SELECT * FROM information_schema.INNODB_TRX 这个只能查询此刻正在进行中的事务,已经完成的是查不到的 表字段定义 The INFORMATION_SCH ...

  10. oracle11g导出表时会发现少表,空表导不出解决方案

    oracle11g导出表时会发现少表,空表导不出解决方案.   一:背景引入 oracle11g用exp命令导出数据库表时,有时会发现只导出了一部分表时而且不会报错,原因是有空表没有进行导出,之前一直 ...