题目描述

YYH有一些总共有种颜色的球,他有颜色的球个。他同样有个盒子,第个盒子能放个球。

他的目标是把这个球按规则放进个盒子里:

  • 对于一个盒子,对于每种颜色的球至多只能放个。

  • 把颜色为的球放进盒子,他能获得的收益。

  • 由于盒子有一定的额外承受能力,所以在最后,对于一个盒子,如果里面的球的数量比多了,那么YYH会有的花费。

YYH不需要把每个球都放到盒子里,他只希望他的收益与花费之差最大。

输入输出格式

第一行输入两个整数,,为球颜色个数和盒子个数。

第二行输入个整数,,分别表示每种颜色小球的个数

第三行输入个整数,,分别表示每个盒子的基础承载能力。

接下来的行每行个数,第行第个数为,表示将颜色为的球放进盒子的收益。

输出一个整数为YYH最大的收益与花费之差

这题的算法优化真是博大精深、

具体我们一个一个来讲。

我们先看这道题的算法,(这。。裸的费用流啊。。。)

然后我们发现负边(好吧,其实没有什么用。spfa可以跑)

首先所有的球都要向源点连费用0,流量为球的数量的边

然后我们考虑每一个球都要到汇点,所以从盒子向汇点连费用0,流量inf的边。

对于每一个球向每一个盒子连费用为-c(c为收益),流量为1的边。

重点来了:怎么处理多放?

我们已知一个公式 n^2-(n-1)^2=n*2-1;

所以我们从每一个盒子向汇点连流量为1,费用为2*n-1的边(一共要连n-x(x为盒子的容量)次)

最后输出-spfa_flow即可

神奇的优化:

TOP1:当前弧优化(扔了!明明跑的更慢)

TOP2:spfa优化(SLF)如果当前点的距离比队首的距离还小就将它插入队首

TOP3:快读(。。。。醉了。。)

其实还有TOP0:费用流中spfa倒着做跑的更快??(学长说的玄学优化)

然后就跑的飞快啦!

再打一个多路增广简直快的飞起

下面贴代码

#include<cstdio>
#include<cstring>
#define inf 0x3f3f3f3f
#define r register
#define min(a,b) (a)<(b)?(a):(b)
#ifndef Debug
#define getchar() (SS==TT&&(TT=(SS=BB)+fread(BB,1,1<<15,stdin),TT==SS)?EOF:*SS++)
char BB[<<],*SS=BB,*TT=BB;
#endif
inline int read(){
r int x; r bool f; r char c;
for (f=; (c=getchar())<''||c>''; f=c=='-');
for (x=c-''; (c=getchar())>=''&&c<=''; x=(x<<)+(x<<)+c-'');
return f?-x:x;
}
using namespace std;
struct edge{
int to,next,c,w;
}g[];
int d[],que[],head[];
bool visit[];
int S,T,num=;
void ins(int u,int v,int c,int w){g[++num].next=head[u];head[u]=num;g[num].c=c;g[num].w=w;g[num].to=v;}
void insw(int u,int v,int c,int w){ins(u,v,c,w);ins(v,u,-c,);}
bool spfa(int S,int T)
{
memset(visit,,sizeof(visit));
memset(d,inf,sizeof(d));
int h=,t=;
que[h]=T;
d[T]=;
visit[T]=true;
while(h<=t)
{
int tmp=que[h++];
for(r int i=head[tmp];i;i=g[i].next)
{
if(g[i^].w&&d[tmp]-g[i].c<d[g[i].to])
{
d[g[i].to]=d[tmp]-g[i].c;//d[g[i].to]=d[tmp]+g[i^1].c;
if (!visit[g[i].to])
{
visit[g[i].to]=true;
if (d[g[i].to]<d[que[h]]) que[--h]=g[i].to;//youhua
else que[++t]=g[i].to;
}
}
}visit[tmp]=;
}
return d[S]!=inf;
}
int dfs(int S,int T,int flow,int &ans)
{
visit[S]=true;
if(S==T)return flow;
int used=,w;
for(r int i=head[S];i;i=g[i].next)
{
if(!visit[g[i].to]&&g[i].w&&d[S]-d[g[i].to]==g[i].c)
{
if(w=dfs(g[i].to,T,min(g[i].w,flow-used),ans))
{
used+=w;
g[i].w-=w;
g[i^].w+=w;
ans+=g[i].c*w;
if(used==flow)return flow;
}
}
}
return used;
}
int mcf(int S,int T){
r int ans=;
while(spfa(S,T))
do
memset(visit,,sizeof(visit));
while(dfs(S,T,inf,ans));
return ans;
}
int main(){
r int n=read(),m=read();
S=;T=n+m+;
r int x;
for(int i=;i<=n;i++)
{
x=read();
insw(S,i,,x);
insw(i,T,,x);
}
for(r int i=;i<=m;i++)
{
x=read();
insw(i+n,T,,x);
for(r int j=;j<=n-x;j++)insw(i+n,T,(j<<)|,);
}
for(r int i=;i<=n;i++)
for(r int j=;j<=m;j++)
{
x=read();
insw(i,n+j,-x,);
}
printf("%d\n",-mcf(S,T));
return ;
}

YYH的球盒游戏(NOIP模拟赛Round 6)的更多相关文章

  1. YYH的积木(NOIP模拟赛Round 6)

    题目描述 YYH手上有n盒积木,每个积木有个重量.现在他想从每盒积木中拿一块积木,放在一起,这一堆积木的重量为每块积木的重量和.现在他想知道重量最少的k种取法的重量分别是多少. 输入输出格式 输入格式 ...

  2. YYH的王国(NOIP模拟赛Round 6)

    题目描述 YYH拥有一个有n个城市的国家,编号为1~n.其中城市i到城市j的路径长度为i和j的最小公倍数.现在YYH想建一些高速公路,使得任意两座城市都能通过高速公路直接或间接到达.建造一条高速公路的 ...

  3. YYH算组合数(NOIP模拟赛Round 6)

    题目描述 YYH手上有一个长度为N的数列,而且这个数列正好能表示为.现在他想知道这个数列的最大公约数是多少,请你帮帮他 输入输出格式 输入格式: 每个数据点包括多组数据,以EOF结束 对于每个数据输入 ...

  4. YYH的营救计划(NOIP模拟赛Round 6)

    题目描述 “咚咚咚……”“查水表!”原来是查水表来了,现在哪里找这么热心上门的查表员啊!YYH感动的热泪盈眶,开起了门…… YYH的父亲下班回家,街坊邻居说YYH被一群陌生人强行押上了警车!YYH的父 ...

  5. YYH的苍天大竹(NOIP模拟赛Round 6)

    题目描述 YYH擅长种竹子.今天他收获了一根竹子,准备将这根柱子卖给CHS.这个竹子有n-1个竹节.CHS要求一定要从竹节的地方砍,而且砍成若干段后每一段竹子中最长的一小段竹子和最短的一小段的长度差不 ...

  6. 水(NOIP模拟赛Round #10)

    题目描述: 小Z有一个长度为的数列.他有次令人窒息的操作,每次操作可以使某个数字或.他当然是希望这些数字的乘积尽量小了.为了简化题目,你只需输出操作完成后的数列即可. ———————————————— ...

  7. 小红帽的画笔(NOIP模拟赛Round 7)

    又到了神奇的模拟赛时间~ 真是丧~ 好吧我们来看看题目 小红帽是Pop star上最著名的人类画家,她可以将任何画出的东西变成真实的物品.赋予她这样神奇能力的正是她手上的画笔. 小红帽每次作画时,都需 ...

  8. 放棋游戏(NOIP模拟赛)(DP)

    没有原题... 囧.. [问题描述] 游戏规则是这样,有n(1<=n<=100)行格子,第一行由n个格子,第二行有n-1个格子,第三行由n-2个格子,……以此类推,第n行有1个格子.要求再 ...

  9. 题(NOIP模拟赛Round #10)

    题目描述: 有一张的地图,其中的地方是墙,的地方是路.有两种操作: 给出个地点,询问这个地点中活动空间最大的编号.若询问的位置是墙,则活动空间为:否则活动空间为询问地点通过四联通能到达的点的个数.如果 ...

随机推荐

  1. TI C6000 数据存储处理与性能优化

    存储器之于CPU好比仓库之于车间.车间加工过程中的原材料.半成品.成品等均需入出仓库,生产效率再快,如果仓库周转不善,也必然造成生产阻塞.如同仓库需要合理地规划管理一般,数据存储也需要恰当的处理技巧来 ...

  2. 零基础学css第二天

    内边距与外边距: <!DOCTYPE html> <html> <head> <title></title> <style type= ...

  3. Python locale 多语言模块和我遇到的坑

    Table of Contents 1. locale遇到的问题 1.1. locale 简介 1.1.1. 什么是locale 1.1.2. locale 相关命令 1.2. Python loca ...

  4. J.U.C 系列之Atomic原子类

    一 什么是原子类? 所谓原子类必然是具有原子性的类,原子性操作--原子操作,百度百科中给的定义如下 "原子操作(atomic operation)是不需要synchronized" ...

  5. 算法:枚举法---kotlin

    枚举法:效率低,循环所有的情况,找到正确答案 用于解决数学问题,还是很简单的. 比如,奥数里面: 算 法 描 述 题X题=题题题题题题 其中 算法描述题每一个为一个数字,请写出正确的数字. ok,我们 ...

  6. chrome 切换到其他网络后重新加载网

    chrome 突然提示 “您与 www.google.com 之间的安全连接目前正受到干扰.  请等待几分钟后再尝试重新加载网页,或在切换到其他网络后重新加载网” 查看证书发现 已经过期 解决:同步下 ...

  7. python考点

    Python考点 1.Python类继承,内存管理(阿里) 答:内存管理机制包括:引用计数机制,垃圾回收机制,内存池机制 a = 1,1就是对象,a就是引用,引用a指向对象1. 2.Python装饰器 ...

  8. jenkins构建定时任务

    jenkins构建定时任务的主要两种形式 1.Build periodically:周期性构建项目,无论有没有代码更新到时间都会构建项目 2.Poll SCM:定时检查源码变更(根据SCM软件的版本号 ...

  9. 把SVN版本控制讲给 非IT同事 听

    场景: 什么是版本: 什么是版本控制: 为什么要用版本控制: 推荐使用SVN: 如何快速理解SVN: SVN简单使用:

  10. 洛谷P1003铺地毯(提高组)

    题目描述 为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯.一共有 n 张地毯,编号从 1 到n. 现在将这些地毯按照编号从小到大的顺序平行于 ...