【最大流】牛棚安排(jzoj 1259)

牛棚安排

jzoj 1259

题目大意:

nnn头牛和mmm个牛棚,每头牛有自己第1喜欢,第2喜欢……第mmm喜欢的牛棚(开心度分别为m,m−1,m−2……1m,m-1,m-2……1m,m1,m21),然后读入mmm个数表示第iii个牛棚最多可以进多少头牛,现在让所有牛都进入到牛棚内,问最开心的牛和最伤心的牛开心度之差最小是多少

输入样例

6 4
1 2 3 4
2 3 1 4
4 2 3 1
3 1 2 4
1 3 4 2
1 4 2 3
2 1 3 2

输出样例

2

样例解释

每头奶牛都能被安排进她的第一或第二喜欢的牛棚。下面给出一种合理的分配方案:奶牛1和奶牛5住入牛棚1,牛棚2由奶牛2独占,奶牛4住进牛棚3,剩下的奶牛3和奶牛6安排到牛棚4。

解题思路

先二分枚举答案,然后枚举每一个区间,接下来用最大流求二分图的匹配即可

代码

#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
using namespace std;
int n, m, l, r, mid, sum, s, t, tot, b[50], head[2000], dep[2000], v[2100][50];const int inf = 1 << 29;struct rec
{int to, next, edge;
}a[40500];queue<int> d;void add(int x, int y, int z)
{a[++tot].to = y;a[tot].edge = z;a[tot].next = head[x];head[x] = tot;a[++tot].to = x;a[tot].edge = 0;a[tot].next = head[y];head[y] = tot;
}bool bfs()
{memset(dep, 0, sizeof(dep));while(!d.empty())	d.pop();d.push(s);dep[s] = 1;while (!d.empty()){int h = d.front();d.pop();for (int i = head[h]; i; i = a[i].next)if (!dep[a[i].to] && a[i].edge){dep[a[i].to] = dep[h] + 1;if (a[i].to == t) return true;d.push(a[i].to);}}return false;
}int dinic(int x, int flow)
{if (x == t) return flow;int rest = 0, k;for (int i = head[x]; i; i = a[i].next)if (dep[x] + 1 == dep[a[i].to] && a[i].edge){k = dinic(a[i].to, min(a[i].edge, flow - rest));if (!k) dep[a[i].to] = 0;rest += k;a[i].edge -= k;a[i^1].edge += k;if (rest == flow) return rest;}return rest;
}bool js(int x)
{s = 0;t = n + m + 1;for (int i = 1; i <= m - x + 1; ++i)//开头位置{memset(head, 0, sizeof(head));tot = 0;for (int j = 1; j <= m; ++j)add(n + j, t, b[j]);//连到Tfor (int j = 1; j <= n; ++j){add(s, j, 1);//连到Sfor (int k = i; k - i + 1 <= x; ++k)add(j, n + v[j][k], 1);//连边}sum = 0;while(bfs())//找增广路sum += dinic(s, inf);//流if (sum == n) return true;//可以满足}return false;
} 
int main()
{scanf("%d%d", &n, &m);for (int i = 1; i <= n; ++i)for (int j = 1; j <= m; ++j)scanf("%d", &v[i][j]);//先存下来,到时再连边for (int i = 1; i <= m; ++i)scanf("%d", &b[i]);l = 1;r = m;while(l < r)//二分枚举{mid = (l + r) >> 1;if (js(mid)) r = mid;else l = mid + 1;}printf("%d", l);return 0;
} 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/320349.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

牛客算法周周练2

文章目录A 相反数B Music ProblemC 完全平方数D 小H和游戏E 水题(water)A 相反数 题解 B Music Problem 题解 C 完全平方数 题解 D 小H和游戏 题解 E 水题(water) 题解

讲一下Asp.net core MVC2.1 里面的 ApiControllerAttribute

正文ASP.NET Core MVC 2.1 特意为构建 HTTP API 提供了一些小特性&#xff0c;今天主角就是 ApiControllerAttribute。0. ApiControllerAttribute 继承自 ControllerAttributeASP.NET Core MVC 已经有了ControllerAttribute&#xff0c;这个用来标注一个类型是否是Controller。…

新的UWP和Win32应用程序分发模型

自2005年引入ClickOnce技术以来&#xff0c;.NET就支持应用程序自动升级。在ClickOnce模型中&#xff0c;WinForms和WPF应用程序在启动时会从预先配置好的位置查找新版本。但是&#xff0c;由于微软试图模仿iOS应用商店模型&#xff0c;所以&#xff0c;该模型未能延续到UWP。微…

[2020.11.25NOIP模拟赛]下棋【dp】

正题 题目链接:https://www.luogu.com.cn/problem/U142297?contestId37766 题目大意 nnn个白棋mmm个黑棋排成一排&#xff0c;要求没有任何一段黑白棋的个数差大于ttt。求方案数。 解题思路 设fi,j,k,lf_{i,j,k,l}fi,j,k,l​表示已经摆了iii个白棋jjj个黑棋&#xff0c;所有…

【结论题(QAQ)】SSL新年欢乐赛暨BPM退役赛 A 送分题(luogu U102372)

送分题 luogu U102372 题目大意 你一开始在xxx轴的原点处&#xff0c;现在给你mmm个命令&#xff0c;分别是向左一位和向右一位&#xff0c;对于所有命令&#xff0c;你可以不走也可以按命令走&#xff0c;问你最后你可能在的位置有所少个 输入样例 4 LRLR输出样例 5数据…

牛客网 【每日一题】4月15日 Treepath

文章目录题目描述题解&#xff1a;代码&#xff1a;传送时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 32768K&#xff0c;其他语言65536K 64bit IO Format: %lld 题目描述 给定一棵n个点的树&#xff0c;问其中有多少条长度为偶数的路径。路径…

.net core grpc 实现通信(一)

现在系统都服务化&#xff0c;.net core 实现服务化的方式有很多&#xff0c;我们通过grpc实现客户端、服务端通信。grpc(https://grpc.io/)是google发布的一个开源、高性能、通用RPC&#xff08;Remote Procedure Call&#xff09;框架&#xff0c;使用HTTP/2协议&#xff0c;…

【数学】数列(jzoj 2752)

数列 jzoj 2752 题目大意&#xff1a; 给你一个正整数n&#xff08;有多组数据&#xff09;&#xff0c;让你把它分为一个连续的正整数列之和&#xff08;长度大于1&#xff09;&#xff0c;然你求着个数列最短的长度&#xff0c;如果这个序列不存在&#xff0c;那输出-1 输…

NOIP提高组复赛 知识点整理

枚举、模拟、贪心、递推、排序&#xff08;快排&#xff09; 高精度&#xff1a; 加法&#xff0c;减法&#xff0c;乘法&#xff08;应该只会有高精乘单精&#xff09;&#xff0c;高精度除单精 分治: 二分查找 整体二分 CDQ分治 三分 搜索: dfs、剪枝 bfs、双向bfs 启发式搜索…

子序列

牛客网题目 题目描述 给出一个长度为n的序列&#xff0c;你需要计算出所有长度为k的子序列中&#xff0c;除最大最小数之外所有数的乘积相乘的结果 输入描述: 第一行一个整数T&#xff0c;表示数据组数。 对于每组数据&#xff0c;第一行两个整数N&#xff0c;k&#xff0c;含义…

P5341-[TJOI2019]甲苯先生和大中锋的字符串【SAM】

正题 题目链接:https://www.luogu.com.cn/problem/P5341 题目大意 给出一个字符串&#xff0c;求出现次数恰好为kkk的子串中&#xff0c;出现最多的长度。 解题思路 先根据TTT构建一个SAMSAMSAM&#xff0c;对于一个endposendposendpos类中&#xff0c;所有出现串的长度一定…

横向扩展你的ASP.NET Core SignalR 应用

前言最近项目要用signalr来做实时通信&#xff0c;在研究asp.netcore signalr 应用横向扩展时候发现了这篇国外的博客&#xff0c;和大家分享一下原文连接地址负载均衡当你把你的应用部署到生产环境时&#xff0c;你将会想横向扩展你的应用。横向扩展意味着要你的应用要在多台服…

P3181-[HAOI2016]找相同字符【SAM】

正题 题目链接:https://www.luogu.com.cn/problem/P3181 题目大意 两个字符串&#xff0c;求有多少个(l1,r1,l2,r2)(l_1,r_1,l_2,r_2)(l1​,r1​,l2​,r2​)使得字符串l1∼r1l_1\sim r_1l1​∼r1​的子串与l2∼r2l_2\sim r_2l2​∼r2​的子串相等。 解题思路 SAMSAMSAM做法 …

池化层(pooling)

目录 一、池化层 1、最大池化层 2、平均池化层 3、总结 二、代码实现 1、最大池化与平均池化 2、填充和步幅(padding和strides) 3、多个通道 4、总结 一、池化层 1、最大池化层 2、平均池化层 3、总结 池化层返回窗口中最大或平均值环节卷积层对位置的敏感性同样有窗口…

牛客网【每日一题】4月16日题目精讲 逆序对

文章目录题目描述题解&#xff1a;代码传送时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 131072K&#xff0c;其他语言262144K 64bit IO Format:%lld 题目描述 求所有长度为n的01串中满足如下条件的二元组个数&#xff1a; 设第i位和第j位分别…

[BZOJ1095][ZJOI2007]捉迷藏 Query on a tree IV(树链剖分)

首先&#xff0c;我们求出树的重链&#xff0c;然后对于每一条链&#xff0c;建一颗线段树 树大概长这样&#xff1a; &#xff08;其中用红边连起来的是一条条重链&#xff09; 在线段树上&#xff0c;我们维护&#xff1a; Opt(u)&#xff1a;经过 u节点代表的链的其中一段 …

【dfs】树(jzoj 2753)

树 jzoj 2753 题目大意&#xff1a; 给你一棵树&#xff0c;每一个点都一个值&#xff0c;现在问你有多少条路径可以满足以下条件&#xff1a; 1、方向都是向下 2、路径上的点的值总和为S 输入样例 3 3 1 2 3 1 2 1 3输出样例 2数据范围 对于30%数据&#xff0c;N⩽100N…

ASP.NET Core Web API + Identity Server 4 + Angular 6 实战小项目视频

今天开始尝试录制ASP.NET Core Web API的教学视频. 这是一个小项目的实战视频, 该项目采用了:ASP.NET Core 2.1 做APIIdentity Server 4Angular 6Angular Material这个项目比较简单, 适合ASP.NET Core Web API 和 Angular 初学者. 项目最终完成的大致效果如图:声明: 以前虽然经…

P6139-[模板]广义后缀自动机(广义 SAM)

正题 题目链接:https://www.luogu.com.cn/problem/P6139 题目大意 求nnn个串的不同子串个数 解题思路 如何在SAMSAMSAM中插入多个字符串。 可以我们可以通过更改lastlastlast为之前的节点来做&#xff0c;如果插入一个之前插入过的节点就按照之前SAMSAMSAM的方法特判就好了。…

[USACO]Sprinklers 2: Return of the Alfalfa P(网格DP)

思路&#xff1a; 由题目易得&#xff1a;网格内种植的两种植物形成了一条 左上—右下 的分界线&#xff0c;考虑将问题转化成 DP求出有多少条合法的分界线 我们注意到&#xff1a; 分界线上的点都必须放洒水器&#xff0c;且所放洒水器有唯一选择&#xff1b; 其他的可以放洒…