题目描述

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[1<<15],*SS=BB,*TT=BB;
#endif
inline int read(){  r int x; r bool f; r char c;  for (f=0; (c=getchar())<'0'||c>'9'; f=c=='-');  for (x=c-'0'; (c=getchar())>='0'&&c<='9'; x=(x<<3)+(x<<1)+c-'0');  return f?-x:x;
}
using namespace std;
struct edge{ int to,next,c,w;
}g[50005];
int d[501],que[5001],head[501];
bool visit[501];
int S,T,num=1;
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,0);}
bool spfa(int S,int T)
{ memset(visit,0,sizeof(visit));  memset(d,inf,sizeof(d)); int h=1,t=1; que[h]=T; d[T]=0; visit[T]=true; while(h<=t) { int tmp=que[h++]; for(r int i=head[tmp];i;i=g[i].next) { if(g[i^1].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]=0; } return d[S]!=inf;
}
int dfs(int S,int T,int flow,int &ans)
{ visit[S]=true; if(S==T)return flow; int used=0,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^1].w+=w; ans+=g[i].c*w; if(used==flow)return flow; } } } return used;
}
int mcf(int S,int T){ r int ans=0; while(spfa(S,T)) domemset(visit,0,sizeof(visit)); while(dfs(S,T,inf,ans)); return ans;
}
int main(){ r int n=read(),m=read(); S=0;T=n+m+5; r int x; for(int i=1;i<=n;i++) { x=read(); insw(S,i,0,x); insw(i,T,0,x); } for(r int i=1;i<=m;i++) { x=read(); insw(i+n,T,0,x); for(r int j=0;j<=n-x;j++)insw(i+n,T,(j<<1)|1,1); } for(r int i=1;i<=n;i++) for(r int j=1;j<=m;j++) { x=read(); insw(i,n+j,-x,1);    } printf("%d\n",-mcf(S,T)); return 0;
} 

转载于:https://www.cnblogs.com/ghostfly233/p/6930202.html

YYH的球盒游戏(NOIP模拟赛Round 6)相关推荐

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

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

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

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

  3. NOI.AC NOIP模拟赛 第六场 游记

    NOI.AC NOIP模拟赛 第六场 游记 queen 题目大意: 在一个\(n\times n(n\le10^5)\)的棋盘上,放有\(m(m\le10^5)\)个皇后,其中每一个皇后都可以向上.下 ...

  4. 【noip模拟赛4】Matrix67的派对 暴力dfs

    [noip模拟赛4]Matrix67的派对 描述 Matrix67发现身高接近的人似乎更合得来.Matrix67举办的派对共有N(1<=N<=10)个人参加,Matrix67需要把他们安排 ...

  5. 【HHHOJ】NOIP模拟赛 捌 解题报告

    点此进入比赛 得分: \(30+30+70=130\)(弱爆了) 排名: \(Rank\ 22\) \(Rating\):\(-31\) \(T1\):[HHHOJ260]「NOIP模拟赛 捌」Dig ...

  6. jyzy noip模拟赛5.22-2

    不知道哪来的题 jyzy noip模拟赛5.22-2 样例输入 1 2 3 4 样例输出 0.200000000000000 数据 |a|,|b|,|c|,|d|<=1e9 很多大佬迅速想到二分 ...

  7. NOIP模拟赛csy2021/10/30

    NOIP模拟赛csy2021/10/30 比赛时间规划 赛后反思与总结 这..总的来说感觉打的很不好,根本没有状态,有一部分原因是今天来晚了,太慌,更多的还是这次题感觉很难o(╥﹏╥)o 比赛时间规划 ...

  8. 【WZOI第二次NOIP模拟赛Day1T2】世界末日 解题报告

    [WZOI第二次NOIP模拟赛Day1T2]世界末日 Problem 2 世界末日 (doomsday.pas/c/cpp) 背景 话说CWQ大牛终于打开了那扇神秘大门,但迎接他的不是什么神秘的东西, ...

  9. NOIP 模拟赛 长寿花 题解

    NOIP 模拟赛 长寿花 题解 要放 \(n\) 层物品,第 \(i\) 层有 \(a_i\) 个位置放物品,物品有 \(m\) 中颜色,有约束条件: 同一层两个相邻物品颜色不能相同. 相邻两层颜色集 ...

  10. 辣鸡(ljh) NOIP模拟赛 模拟 平面几何 数论 化学相关(雾)

    [题目描述] 辣鸡ljhNOI之后就退役了,然后就滚去学文化课了. 然而在上化学课的时候,数学和化学都不好的ljh却被一道简单题难住了,受到了大佬的嘲笑. 题目描述是这样的:在一个二维平面上有一层水分 ...

最新文章

  1. 一起学Hadoop——Hadoop的前世今生
  2. Linux下启动和关闭Oracle数据库的方法
  3. java实验七输入输出流_实验六_Java的输入输出流
  4. PP: 混合生产方式(MTO与MTS为例)
  5. 攻击者使用“非恶意软件”也能识别,将在RSA 2017上发布的新技术
  6. photoshop script
  7. 【linux系统编程】基础开发工具:yum
  8. sax解析xml案例一
  9. 【SQL注入01】SQL注入漏洞简介、原理及类型
  10. 地铁票务管理系统_地铁票务管理是干什么
  11. java同期_Java日期处理-本期,同期,上期
  12. 计算机专业研究生和本科生工资差距,本科生和研究生的工资差距,到底有多大?...
  13. B - Zhu and 772002(高斯消元解异或方程)
  14. Katana 项目入门
  15. Windows fatal exception: code 0xe06d7363
  16. Mysql - 知识图谱总览
  17. STM32标准库、HAL库特点与应用
  18. python爬虫用urllib还是reques_Python爬虫之urllib.request库
  19. Cytoscape安装及使用
  20. 关联规则之购物篮分析

热门文章

  1. android椭圆形形框_什么是计算机硬件上的椭圆形Kong?
  2. 冷血格斗场和热血格斗场
  3. 生日祝福电子贺卡html5,电子生日祝福卡
  4. ios代码拨打电话时,电话号码格式兼容性处理问题:
  5. uos服务器系统rpm安装oracle 19c
  6. StrokeIt:让鼠标手势无处不在
  7. 其实读一读,真的安静了
  8. 从hr口中了解react的状态管理库(mobx, recoil), 立马过来学习之mobx
  9. ubuntu 解包和压包.img文件
  10. [Gym] - 100886K 2015-2016 Petrozavodsk Winter Training Camp, Saratov SU Contest K - Toll Roads