[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介绍 ...
随机推荐
- MySQL之数据库和表的基本操作(建立表、删除表、向表中添加字段)
介绍关于数据库和表的一些基本操作 添加字段.给字段添加注释 ); ) COMMENT '统一社会信用代码录入单位'; ,) 更改字段类型 ,) COMMENT '一头签收,@0或空不用,1必须'; 有 ...
- C语言第零次作业总结
本次作业发现的亮点 没有发现抄袭的现象,大家都是独立且认真地完成这次的作业,希望再接再厉,继续保持 戴洁 陈欢 陈张鑫三位同学的博客写的不错,希望同学们向这三位同学学习,认真对待每次作业 本次作业的问 ...
- 201621123040《Java程序设计》第十一周学习总结
1.本周学习总结 1.1以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2.书面作业 2.1源代码阅读:多线程程序BounceThread 2.1.1BallRunnable类有什么用?为什 ...
- LeetCode---Container With Most Water(11)
Description: Given n non-negative integers a1, a2, ..., an, where each represents a point at coordin ...
- Beta冲刺Day4
项目进展 李明皇 今天解决的进度 因服务器端未完成登录态维护,故无法进行前后端联动. 明天安排 前后端联动调试 林翔 今天解决的进度 因上课和实验室事务未完成登录态维护 明天安排 完成登录态维护 孙敏 ...
- Echarts柱状图实现不同颜色渐变色
第一次写文,只是想记录一下自己平时发现的小功能,这篇主要是实现echarts柱状图,每个柱子实现不同颜色的渐变色,也是第一次接触echarts,后台使用ssm,前台是extjs,直接上效果图 直接上j ...
- 更优雅的方式: JavaScript 中顺序执行异步函数
火于异步 1995年,当时最流行的浏览器--网景中开始运行 JavaScript (最初称为 LiveScript). 1996年,微软发布了 JScript 兼容 JavaScript.随着网景.微 ...
- 业余草基于JAVA的模块化开发框架JarsLink
需求背景 应用拆分的多或少都有问题.多则维护成本高,每次发布一堆应用.少则拆分成本高,无用功能很难下线.故障不隔离.当一个系统由多人同时参与开发时,修改A功能,可能会影响B功能,引发故障.多分支开发引 ...
- Python内置函数(9)——int
英文文档: class int(x=0) class int(x, base=10) Return an integer object constructed from a number or str ...
- 实现一个网易云音乐的 BottomSheetDialog
作者:林冠宏 / 指尖下的幽灵 掘金:https://juejin.im/user/587f0dfe128fe100570ce2d8 博客:http://www.cnblogs.com/linguan ...