题目描述

有 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. 微信APP简要分析

    Part1 走进微信APP 很明显,微信是很成功的APP. 微信 (WeChat) 是腾讯公司于2011年1月21日推出的一个为智能终端提供即时通讯服务的免费应用程序,现已是超过九亿人使用的手机应用. ...

  2. 结合Socket实现DDoS攻击

    一.实验说明 1. 实验介绍 通过上一节实验的SYN泛洪攻击结合Socket实现DDoS攻击. 2. 开发环境 Ubuntu Linux Python 3.x版本 3. 知识点 本次实验将涉及以下知识 ...

  3. V7000数据恢复(存储文件系统损坏)案例_北亚数据恢复

    我们今天介绍的数据恢复案例是一起 v7000存储文件系统损坏导致的数据丢失,首先简单介绍一下设备基本情况:发生文件系统损坏的是一台挂载在Windows2003服务器上的v7000存储,划分了一个容量为 ...

  4. 02-移动端开发教程-CSS3新特性(中)

    1. 新的背景 背景在CSS3中也得到很大程度的增强,比如背景图片尺寸.背景裁切区域.背景定位参照点.多重背景等. 1.1 background-size设置背景图片的尺寸 cover会自动调整缩放比 ...

  5. python识别验证码——PIL,pytesser,pytesseract的安装

    1.使用Python识别验证码需要安装Python的图像处理模块(PIL.pytesser.pytesseract) (安装过程需要pip,在我的Python中已经安装pip了,pip的安装就不在赘述 ...

  6. Win7添加php环境变量.

    1) "我的电脑"右键"属性"->高级系统设置->环境变量->系统变量->Path->编辑 2) 将PHP的执行路径的目录&quo ...

  7. JavaScript 基础学习1-day14

    JavaScript 基础学习1 知识预览JavaScript概述二 JavaScript的基础三 JavaScript的对象BOM对象DOM对象实例练习js扩展 JavaScript概述 JavaS ...

  8. Python-基础学习-Day1

    1 Python介绍 1.1 Python 是一门什么样的语言? python是一门动态解释性的强类型定义语言. 编译型的特点:可一致性差,运行速度快. 解释型的特点:边执行边解释,速度慢 1.2 P ...

  9. 隐藏Easy UI 中parent.$.modalDialog 的button

    例子: buttons : [ { text : '关闭', handler : function() { parent.$.modalDialog.handler.dialog('close'); ...

  10. 新概念英语(1-105)Full Of Mistakes

    Lesson 105 Full of mistakes 错误百出 Listen to the tape then answer this question. What was Sandra's pre ...