郁闷的gxg

原创 2015年11月18日 20:21:30

题意

由于省赛的失利(难以理喻的失常),gxg心情十分沉痛—不能为校争光,也辜负了老师的一番陪养。除此以外更多的是郁闷,但gxg知道大学的大门不会因为自己的郁闷而为自己打开,所以一定要振作起来。为了排遣郁闷,gxg开始玩起了智力游戏。
游戏是这样子的:
n个盒子被放成一圈,每个盒子按顺时针编号为1到n,(1<=n<=1000)。每个盒子里都有一些球,且所有盒子里球的总数不超过n。
这些球要按如下的方式转移:每一步可以将一个球从盒子中取出,放入一个相邻的盒子中。目标是使所有的盒子中球的个数都不超过1。
任务
• 从文件d.in中读入盒子的个数和每个盒子中球的个数
• 计算最少的步数是每个盒子中的球的个数不超过1

分析

给你n个盒子,让你进行尽量少的操作去往左和右放,使得每个盒子的个数不超过1。
所以这题的约束条件便是每个盒子不超过1,而附加条件便是操作数最小。
所以我们可以先把图构出来再跑费用流。
如何构图呢?
我们可以从源点向每个盒子连一条容量为当前盒子的球个数,费用为0的边。
而每个盒子向左右连一条容量为maxlongint,费用为1的边。
最后再从每个盒子向汇点连容量为1,费用为0的边。
最后跑一次最小的费用流即可。

var
    n,t,i,x,ans,nu:longint;
    b,las,nex,f,v,a,dis,re:array[0..10000] of longint;
    bz:array[0..10000] of boolean;
procedure insert(x,y,z,k:longint);
begin
    inc(nu);b[nu]:=y;nex[nu]:=las[x];las[x]:=nu;f[nu]:=z;v[nu]:=k;
    inc(nu);b[nu]:=x;nex[nu]:=las[y];las[y]:=nu;f[nu]:=0;v[nu]:=-k;
end;
function spfa:boolean;
var l,r,now,p:longint;
begin
    l:=0;r:=1;fillchar(bz,sizeof(bz),false);fillchar(dis,sizeof(dis),127);dis[0]:=0;bz[0]:=true;a[1]:=0;
    while l<r do begin
       inc(l);now:=a[l];p:=las[now];
       while p<>0 do begin
          if (dis[b[p]]>dis[now]+v[p])and(f[p]>0) then begin
             dis[b[p]]:=dis[now]+v[p];re[b[p]]:=p;
             if not bz[b[p]] then begin inc(r);a[r]:=b[p];bz[b[p]]:=true;end;
          end;p:=nex[p];
       end;bz[now]:=false;
    end;
    exit(dis[t]<>dis[10000]);
end;
function min(l,r:longint):longint;
begin
    if l<r then exit(l);exit(r);
end;
procedure find;
var sum,x:longint;
begin
    x:=t;sum:=maxlongint;
    while x<>0 do begin
        sum:=min(sum,f[re[x]]);x:=b[re[x] xor 1];
    end;x:=t;
    while x<>0 do begin
        dec(f[re[x]],sum);inc(f[re[x]xor 1],sum);inc(ans,v[re[x]]*sum);
        x:=b[re[x] xor 1];
    end;
end;
begin
    readln(n);
    t:=n+1;nu:=1;
    insert(1,n,maxlongint,1);
    insert(n,1,maxlongint,1);
    for i:=1 to n do begin
        readln(x);
        insert(0,i,x,0);
        insert(i,t,1,0);
        if i<>n then insert(i,i+1,maxlongint,1);
        if i<>1 then insert(i,i-1,maxlongint,1);
    end;
    while spfa do find;
    writeln(ans);
end.
版权声明:本文为博主原创文章,未经博主允许不得转载。

JZOJ 1533. 郁闷的gxg

Description由于省赛的失利(难以理喻的失常),gxg心情十分沉痛—不能为校争光,也辜负了老师的一番陪养。除此以外更多的是郁闷,但gxg知道大学的大门不会因为自己的郁闷而为自己打开,所以一定要...
  • liyizhixl
  • liyizhixl
  • 2017年03月24日 20:43
  • 203

(题解)(Splay)NOI2004郁闷的出纳员

题目比较简单,用splay动态维护一个可以整体删除的集合, 不需要打下标,打个上标维护size求kth, 用delta记录偏移即可完成所有操作。   调试了两个小时,后来发现因初始工资而走的员工不能算...
  • kingpharaoh
  • kingpharaoh
  • 2015年08月20日 15:14
  • 1209

[noi 2004] 郁闷的出纳员

原题地址  花了一两天真正的熟悉了Treap,对于一个东西,本蒟蒻认为,不应该要会,还应会熟练的写,【像哈狗写这个只需十分钟】 好吧,话归正题 先推荐另类解法 戳进去   此题解法很多B...
  • DraZxlNDdt
  • DraZxlNDdt
  • 2016年03月23日 21:56
  • 453

BZOJ 1503 [NOI2004] 郁闷的出纳员 treap

题意: 链接 方法: treap 解析: 这是本蒟蒻的第二道treap题,第二遍写的时候update,左旋右旋,插入函数都可以大概写出来了(还是得练啊),然而del  函数却被虐了,自己也想...
  • wzq_QwQ
  • wzq_QwQ
  • 2015年03月20日 13:44
  • 2359

codevs1286 郁闷的出纳员

#include #include #include #include #include #define lchild rt
  • den1018638294
  • den1018638294
  • 2014年12月18日 22:00
  • 204

假spaly害人-洛谷P1486 郁闷的出纳员

https://www.luogu.org/problem/show?pid=1486#sub 我以前的spaly他妈全抄模版的,然后觉得这样太颓废了,就很装逼地想自己写这题; 其实我理论都懂的,...
  • largecub233
  • largecub233
  • 2017年03月06日 09:25
  • 451

NOI2004郁闷的出纳员题解

描述 OIER公司是一家大型专业化软件公司,有着数以万计的员工。作为一名出纳员,我的任务之一便是统计每位员工的工资。这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常调整员工的工资。...
  • t14t41t
  • t14t41t
  • 2015年08月09日 11:38
  • 986

BZOJ 1503 郁闷的出纳员 二叉平衡树(Treap,Splay)

timud 第一行有两个非负整数n和min。n表示下面有多少条命令,min表示工资下界。 接下来的n行,每行表示一条命令。命令可以是以下四种之一: 名称 格式 ...
  • jiangyuze831
  • jiangyuze831
  • 2014年09月03日 12:32
  • 656

BZOJ1503 NOI2004 郁闷的出纳员 题解&代码

题意太傻不多解释= =就是维护一个档案队列,按节点val建树思路: 从query操作(命令F)可以看出,这棵树的顺序核心在于value而不是一般的维护队列,这样的话相同value的节点显而易见地应该...
  • Rainbow6174
  • Rainbow6174
  • 2015年12月29日 18:11
  • 1061

关于Android中https的网络访问的问题z

最近在一家金融类公司就职,发现他们的网站全是https的我顿时就郁闷了,以前从来没有遇到过https开发的域名。https的域名怎么访问呢?下面咱们就来解决这个问题: 首先要确定https的证书是自...
  • xiongshiwei1234567
  • xiongshiwei1234567
  • 2015年03月16日 15:49
  • 307
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:郁闷的gxg
举报原因:
原因补充:

(最多只允许输入30个字)