一道随机算法的题目

随便用什么随机算法

首先我们可以想到枚举类型3的最终类型,然后再做

先贪心出一个较优的序列,首先我们知道肯定是在A机器上先做完类型1的事件再做类型2的事件,机器B也类似,因为这些没有等待时间,而他们做完了后续事情才能做

然后对类型1进行排序,按timeb为第一关键字降序(为了填补空隙,前面的越大排得就越紧密),按timea为第二关键字升序排序(尽量早点让类型1的B机器上的事先做),类型2的也类似

然后随机2000次左右(每次随机交换类型1的两个和类型2的两个)正确率就很高了

 const
maxn=;
inf=;
type
node=record
kind,a,b,time:longint;
end;
var
a:array[..maxn]of node;
aa,bb,sa,sb:array[..maxn]of longint;
n,ans,ta,tb,numa,numb,suma,sumb:longint; function min(x,y:longint):longint;
begin
if x<y then exit(x);
exit(y);
end; function max(x,y:longint):longint;
begin
if x>y then exit(x);
exit(y);
end; procedure swap(var x,y:longint);
var
t:longint;
begin
t:=x;x:=y;y:=t;
end; procedure init;
var
i:longint;
begin
read(n);
for i:= to n do
with a[i] do
read(kind,a,b);
ans:=inf;
end; function geta:boolean;
var
k:longint;
begin
if numa>n then exit(false);
if numa>suma then k:=bb[numa-suma]
else k:=aa[numa];
if (a[k].kind=) or (a[k].time>) then
begin
ta:=max(ta,a[k].time)+a[k].a;
a[k].time:=ta;
inc(numa);
exit(true);
end;
exit(false);
end; function getb:boolean;
var
k:longint;
begin
if numb>n then exit(false);
if numb>sumb then k:=aa[numb-sumb]
else k:=bb[numb];
if (a[k].kind=) or (a[k].time>) then
begin
tb:=max(tb,a[k].time)+a[k].b;
a[k].time:=tb;
inc(numb);
exit(true);
end;
exit(false);
end; procedure get;
var
i,j,lastans:longint;
begin
suma:=;
sumb:=;
lastans:=inf;
for i:= to n do
if a[i].kind= then
begin
inc(suma);
sa[suma]:=i;
end
else
begin
inc(sumb);
sb[sumb]:=i;
end;
for i:=suma downto do
for j:= to i- do
if (a[sa[j+]].b>a[sa[j]].b) or ((a[sa[j+]].b=a[sa[j]].b) and (a[sa[j+]].a<a[sa[j]].a)) then swap(sa[j],sa[j+]);
for i:=sumb downto do
for j:= to i- do
if (a[sb[j+]].a>a[sb[j]].a) or ((a[sb[j+]].a=a[sb[j]].a) and (a[sb[j+]].b<a[sb[j]].b)) then swap(sb[j],sb[j+]);
for j:= to do
begin
aa:=sa;
bb:=sb;
if suma<> then
swap(aa[random()mod suma+],aa[random()mod suma+]);
if sumb<> then
swap(bb[random()mod sumb+],bb[random()mod sumb+]);
for i:= to n do
a[i].time:=;
ta:=;
tb:=;
numa:=;
numb:=;
while (numa<=n) or (numb<=n) do
begin
if ta<tb then
begin
if geta=false then getb;
end
else
if getb=false then geta;
end;
if lastans>=max(ta,tb) then
begin
lastans:=max(ta,tb);
ans:=min(lastans,ans);
sa:=aa;
sb:=bb;
end;
end;
end; procedure try(x:longint);
begin
if x=n+ then get
else
if a[x].kind= then
begin
a[x].kind:=;
try(x+);
a[x].kind:=;
try(x+);
a[x].kind:=;
end
else try(x+);
end; begin
randomize;
init;
try();
write(ans);
end.

2336: [HNOI2011]任务调度 - BZOJ的更多相关文章

  1. [HNOI2011]任务调度

    题目描述 有 N 个任务和两台机器 A 与 B.每个任务都需要既在机器 A 上执行,又在机器 B 上执行, 第 i 个任务需要在机器 A 上执行时间 Ai,且需要在机器 B 上执行时间 Bi.最终的目 ...

  2. bzoj2336 [HNOI2011]任务调度

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

  3. bzoj AC倒序

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

  4. BZOJ 2326: [HNOI2011]数学作业( 矩阵快速幂 )

    BZOJ先剧透了是矩阵乘法...这道题显然可以f(x) = f(x-1)*10t+x ,其中t表示x有多少位. 这个递推式可以变成这样的矩阵...(不会用公式编辑器...), 我们把位数相同的一起处理 ...

  5. ●BZOJ 2329 [HNOI2011]括号修复.cpp

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=2329 题解: Splay 类似 BZOJ 2329 [HNOI2011]括号修复 只是多了一 ...

  6. 【概率DP/高斯消元】BZOJ 2337:[HNOI2011]XOR和路径

    2337: [HNOI2011]XOR和路径 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 682  Solved: 384[Submit][Stat ...

  7. [BZOJ 2326] [HNOI2011] 数学作业 【矩阵乘法】

    题目链接:BZOJ - 2326 题目分析 数据范围达到了 10^18 ,显然需要矩阵乘法了! 可以发现,向数字尾部添加一个数字 x 的过程就是 Num = Num * 10^k + x .其中 k ...

  8. BZOJ 2329: [HNOI2011]括号修复( splay )

    把括号序列后一定是))))((((这种形式的..所以维护一个最大前缀和l, 最大后缀和r就可以了..答案就是(l+1)/2+(r+1)/2...用splay维护,O(NlogN). 其实还是挺好写的, ...

  9. BZOJ 2337: [HNOI2011]XOR和路径( 高斯消元 )

    一位一位考虑异或结果, f(x)表示x->n异或值为1的概率, 列出式子然后高斯消元就行了 --------------------------------------------------- ...

随机推荐

  1. 【Knockout】四、绑定上下文

    Binding context binding context是一个保存数据的对象,你可以在你的绑定中引用它.当应用绑定的时候,knockout自动创建和管理binding context的继承关系. ...

  2. IT技术开发人员35岁之前应该做的十件事

    第一,学会本行业所需要的一切知识并有所发展.已故零件大王布鲁丹在他35岁时,已经成为零件行业的领袖,并且组建了年收入达千万美元的海湾与西部工业公司.每个人在年轻时都可能有过彻夜不眠.刻苦攻读,这在20 ...

  3. Javascript之换肤(未完待续)

    这个项目我还没有完全写出来,先记录至此.感觉是方法不对,背景图片的切换方法有Problem.如若有一大神发现了我的文章,还望指导,吾将感激不尽.日后代码还会再钻研再改改. <head> & ...

  4. Nginx+Tomcat实现反向代理与动静分离

    1. 什么是动静分离  所谓动静分离就是通过nginx(或apache等)来处理用户端请求的静态页面,tomcat(或weblogic)处理动态页面,从而达到动静页面访问时通过不同的容器来处理. 2. ...

  5. vJine 第三波 之 Lua 来袭 vJine.Lua

    vJine.Lua vJine.Lua是Lua语言的C#封装库,可实现通过C#直接运行Lua脚本并与Lua脚本交互的功能. 1. 授权: MPL2.0 相关资源: nuget:(https://www ...

  6. Java 读写XML文件 API--org.dom4j

    om4j是一个Java的XML API,类似于jdom,用来读写XML文件的.dom4j是一个十分优秀的JavaXML API,具有性能优异.功能强大和极其易使用的特点,同时它也是一个开放源代码的软件 ...

  7. 详解null

    前言 在java中初始化的时候经常用到null,也经常会碰到空指针异常(NullPointerException),由于碰到的频率比较高,我认为有必要进行一下了解,揭开它的神秘面纱. 一.null是代 ...

  8. 查看mysql集群状态是否正常

    如何查看mysql集群状态是否正常: 进入mysql 输入show status like 'wsrep%': 查看cluster sizes 是否为3

  9. maven安装配置(myeclipse)(一)

    欢迎转载:http://www.cnblogs.com/shizhongtao/p/3374130.html 对于我来说,maven主要用于jar包的管理,避免项目中频繁更换jar的版本,以及网上搜索 ...

  10. rolling hash

    也是需要查看,然后修改,rolling hash, recursive hash, polynomial hash, double hash.如果一次不够,那就2次.需要在准备一个线段树,基本的线段树 ...