[USACO06FEB]Steady Cow Assignment G【二分+最大流】

2023-11-11

题目链接 P2857 [USACO06FEB]Steady Cow Assignment G


  有N头牛,B个牛棚.告诉你每头牛心里牛棚的座次,即哪个牛棚他最喜欢,哪个第2喜欢, 哪个第3喜欢,等等.但牛棚容量一定,所以每头牛分配到的牛棚在该牛心中的座次有高有低.现 在求一种最公平的方法分配牛到牛棚,使所有牛中,所居牛棚的座次最高与最低的跨度最小.

数据范围:(1 <= N <= 1000) ,(1 <= B <= 20)

  看到这样的数据范围,很明显的是B很小,我们的答案也就是1~B这个区间了,我们甚至可以枚举答案,因为常数只有20,当然,我们也可以二分这个答案,这样就更小了。

  我们二分答案mid,然后枚举范围是1~mid还是2~mid+1还是3~mid+2以此类推,来判断答案的可行性,如果最大流为N那么答案就是可行的。

#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <algorithm>
#include <limits>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <bitset>
//#include <unordered_map>
//#include <unordered_set>
#define lowbit(x) ( x&(-x) )
#define pi 3.141592653589793
#define e 2.718281828459045
#define INF 0x3f3f3f3f3f3f3f3f
#define eps 1e-8
#define HalF (l + r)>>1
#define lsn rt<<1
#define rsn rt<<1|1
#define Lson lsn, l, mid
#define Rson rsn, mid+1, r
#define QL Lson, ql, qr
#define QR Rson, ql, qr
#define myself rt, l, r
#define MP(a, b) make_pair(a, b)
#define MAX_3(a, b, c) max(a, max(b, c))
using namespace std;
typedef unsigned long long ull;
typedef unsigned int uit;
typedef long long ll;
const int maxN = 1e3 + 27, maxM = 1e5 + 7;
int N, B, mp[1005][25], cap[25];
int S, T, head[maxN], cnt, cur[maxN];
struct Eddge
{
    int nex, to; ll flow;
    Eddge(int a=-1, int b=0, ll c=0):nex(a), to(b), flow(c) {}
}edge[maxM];
inline void addEddge(int u, int v, ll w)
{
    edge[cnt] = Eddge(head[u], v, w);
    head[u] = cnt++;
}
inline void _add(int u, int v, ll w) { addEddge(u, v, w); addEddge(v, u, 0); }
struct Max_Flow
{
    int gap[maxN], d[maxN], que[maxN], ql, qr, node;
    inline void init()
    {
        for(int i=0; i<=node + 1; i++)
        {
            gap[i] = d[i] = 0;
            cur[i] = head[i];
        }
        ++gap[d[T] = 1];
        que[ql = qr = 1] = T;
        while(ql <= qr)
        {
            int x = que[ql ++];
            for(int i=head[x], v; ~i; i=edge[i].nex)
            {
                v = edge[i].to;
                if(!d[v]) { ++gap[d[v] = d[x] + 1]; que[++qr] = v; }
            }
        }
    }
    inline ll aug(int x, ll FLOW)
    {
        if(x == T) return FLOW;
        int flow = 0;
        for(int &i=cur[x], v; ~i; i=edge[i].nex)
        {
            v = edge[i].to;
            if(d[x] == d[v] + 1)
            {
                ll tmp = aug(v, min(FLOW, edge[i].flow));
                flow += tmp; FLOW -= tmp; edge[i].flow -= tmp; edge[i ^ 1].flow += tmp;
                if(!FLOW) return flow;
            }
        }
        if(!(--gap[d[x]])) d[S] = node + 1;
        ++gap[++d[x]]; cur[x] = head[x];
        return flow;
    }
    inline ll max_flow()
    {
        init();
        ll ret = aug(S, INF);
        while(d[S] <= node) ret += aug(S, INF);
        return ret;
    }
} mf;
inline void init()
{
    cnt = 0; S = 0; T = N + B + 1; mf.node = T + 1;
    for(int i=0; i<=mf.node; i++) head[i] = -1;
    for(int i=1; i<=N; i++) _add(S, i, 1);
    for(int i=1; i<=B; i++) _add(N + i, T, cap[i]);
}
inline bool solve(int lim)
{
    for(int i=1; i<=B - lim + 1; i++)
    {
        init();
        for(int u=1; u<=N; u++)
        {
            for(int j=i; j<=i+lim - 1; j++)
            {
                _add(u, N + mp[u][j], 1);
            }
        }
        if(mf.max_flow() == N) return true;
    }
    return false;
}
int main()
{
    scanf("%d%d", &N, &B);
    for(int i=1; i<=N; i++)
    {
        for(int j=1; j<=B; j++)
        {
            scanf("%d", &mp[i][j]);
        }
    }
    for(int i=1; i<=B; i++) scanf("%d", &cap[i]);
    int L = 1, R = B, mid, ans = B;
    while(L <= R)
    {
        mid = (L + R) >> 1;
        if(solve(mid))
        {
            R = mid - 1;
            ans = mid;
        }
        else L = mid + 1;
    }
    printf("%d\n", ans);
    return 0;
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[USACO06FEB]Steady Cow Assignment G【二分+最大流】 的相关文章

  • 【C语言】图的邻接表——超详细解析

    图的邻接表 我们重点分析一下无向图 邻接表 我们如何将图中所有顶点和边建立起联系 1 我们发现 V0这个顶点与V1和V3相连 通过右边的邻接表可以看到会出现一个以 V0为头结点的单链表 后面连接的元素就是V1和V3 在顶点数组中的下标 2
  • 数据结构 图 part2

    文章目录 图的遍历 深度优先遍历 DFS 遍历步骤 邻接矩阵的存储 邻接表的存储 广度优先遍历 BFS 遍历步骤 非连通图的遍历 连通分量 如何遍历 生成树 图的遍历 深度优先遍历 DFS 遍历步骤 在访问图中某一起始顶点v后 由v出发 访
  • LeetCode-剑指 Offer II 114. 外星文字典,BFS 搜索算法及图的表示

    剑指 Offer II 114 外星文字典 现有一种使用英语字母的外星文语言 这门语言的字母顺序与英语顺序不同 给定一个字符串列表 words 作为这门语言的词典 words 中的字符串已经 按这门新语言的字母顺序进行了排序 请你根据该词典
  • 【算法学习笔记】19:拓扑排序

    1 简述 计算拓扑序列的一个方式是 用BFS来尝试访问所有的节点 但是有一个约束就是只有入度为 0 0 0的节点才能被加入到扩展队列里 每次从队列里取出一个节点 也就同时在图中将这个节点拆除 所以它的所有后继的节点都减少 1 1 1 如果已
  • 【构造】0617 Edge Split

    题意 给定一个 n n n 点 m m m 条边的无向连通图 其中 1
  • Supermarket 【POJ - 1456】【并查集+哈希表思想+贪心】

    题目链接 原来 并查集还有这样的作用 题记 我想用个哈希表的思维来解这道题 但是 显然O N 2 的哈希表去查询并插入显然是不行的 那么既然挂在图论专题 我就得用相应的方式解答咯 要是不挂在图论专题 我可能会自闭了 我们对于每个物品按照价值
  • 数据结构——普里姆(Prim)算法

    普里姆算法 Prim算法 图论中的一种算法 可在加权连通图里搜索最小生成树 意即由此算法搜索到的边子集所构成的树中 不但包括了连通图里的所有顶点 且其所有边的权值之和亦为最小 以下是数据结构中关于普里姆算法的操作 编程风格参考严蔚敏版数据结
  • Road Construction POJ - 3352(tarjan双连通缩点模板)

    题目描述 给一个无向连通图 至少添加几条边使得去掉图中任意一条边不改变图的连通性 即使得它变为边双连通图 include
  • 图论17(Leetcode864.获取所有钥匙的最短路径)

    用二进制表示获得的钥匙 假设n 钥匙个数 000000000代表没有钥匙 0000000001代表有idx为1的钥匙 0000000011代表有idx 1 2的钥匙 这方法巧妙又复杂 代码 class Solution static int
  • 图的应用--Prim算法

    图的应用 Prim算法 Prim算法是一种基于顶点的贪心算法 从起始顶点出发 每次迭代选择当前可用的最小权值边 然后把边上依附的其他顶点加入最小生成树 prim算法可以称为 加点法 比较适合稠密图 算法思想 设G V E 是一个加权连通图
  • 大学生团体天梯赛(第十届)

    题目地址 天梯赛 include
  • 【01规划】POJ 3621 Sightseeing Cows

    POJ 3621 Sightseeing Cows 题意 给定一张 n 个点 m 条边的有向图 每个点都有一个权值 f i 每条边都有一个权值 t i 求图中的一个环 使 环上各点的权值之和 除以 环上各边的权值之和 最大 输出这个最大值
  • 离散数学第一章总结

    离散数学第一章 1 公式类型 1 重言式 也是永真式 公式真值恒为1 2 矛盾式 永假式 真值恒为0 3 可满足式 不是矛盾式的就都是可满足式 重言式一定是可满足式 2 成真赋值与成假赋值 也叫成真指派与成假指派 一组原子的取值 真值指派
  • POJ 3259 Wormholes(最短路——Bellman-ford)

    A Wormholes While exploring his many farms Farmer John has discovered a number of amazing wormholes A wormhole is very p
  • Summer Holiday HDU - 1827 强连通分量+缩点

    To see a World in a Grain of Sand And a Heaven in a Wild Flower Hold Infinity in the palm of your hand And Eternity in a
  • 蓝桥杯 题库 简单 每日十题 day2

    01 卡片 题目描述 本题为填空题 只需要算出结果后 在代码中使用输出语句将所填结果输出即可 小蓝有很多数字卡片 每张卡片上都是数字 0 到 9 小蓝准备用这些卡片来拼一些数 他想从 1 开始拼出正整数 每拼一个 就保存起来 卡片就不能用来
  • UVA-10603 倒水问题 题解答案代码 算法竞赛入门经典第二版

    GitHub jzplp aoapc UVA Answer 算法竞赛入门经典 例题和习题答案 刘汝佳 第二版 使用广度优先搜索和优先队列 如果找到最小的点则退出 找不到就遍历所有的情况 include
  • 1345:香甜的黄油(Dijkstra)---信息学奥赛一本通

    题目描述 农夫John发现做出全威斯康辛州最甜的黄油的方法 糖 把糖放在一片牧场上 他知道N 1 N 500 只奶牛会过来舔它 这样就能做出能卖好价钱的超甜黄油 当然 他将付出额外的费用在奶牛上 农夫John很狡猾 像以前的巴甫洛夫 他知道
  • 讲解 最大流问题+最小花费问题+python(ortool库)实现

    文章目录 基本概念 图 邻接矩阵 最大流问题 python解决最大流问题 python解决最大流最小费用问题 喜欢的话请关注我们的微信公众号 你好世界炼丹师 公众号主要讲统计学 数据科学 机器学习 深度学习 以及一些参加Kaggle竞赛的经
  • 坐标前后限制转点的坐标取值+网络流拆维拆点:agc031_e

    https vj imken moe contest 598718 problem J 观察到数据范围很小 但一个很重要的信息我们缺失了 就是珠宝的数量 所以我们考虑枚举珠宝的数量 k k k 对于横纵坐标什么至多至少的限制 比如 a i

随机推荐

  • 788. 旋转数字

    788 旋转数字 我们称一个数 X 为好数 如果它的每位数字逐个地被旋转 180 度后 我们仍可以得到一个有效的 且和 X 不同的数 要求每位数字都要被旋转 如果一个数的每位数字被旋转以后仍然还是一个数字 则这个数是有效的 0 1 和 8
  • 田志刚:企业知识管理的知识传播

    知识管理本身的知识传播是知识管理在国内发展的一个重要课题 虽然我们都认为知识管理有价值 但更多的人不知道 所以如何让更多的人知道KM 理解并知道如何实践就成为知识管理的知识传播的重要内容 知识管理的知识传播可以分两个层面 一个层面是对于社会
  • VMware Workstation Pro 16 安装win7

    本文使用U盘工具创建 至于为什么安装win7 毕竟很多游戏在win10已经没法玩了 1 创建虚拟机 典型创建即可 2 添加硬盘 SCSI类型 使用物理磁盘 物理驱动2 使用整个磁盘 这里的驱动2就是U盘 创建完成 这时候应该是正在使用该设备
  • python高级知识之常用的魔术方法

    文章目录 1 init 魔术方法 2 new 魔术方法 3 str 魔术方法 4 del 魔术方法 5 call 魔术方法 6 len 魔术方法 7 eq 魔术方法 8 hash 魔术方法 9 getitem 魔术方法 10 setitem
  • 解决 vs code 搜索中文结果异常的问题

    文章目录 一 引言 二 解决 一 引言 最近在工作中遇到了一个很诡异的问题 在使用 vs code 过程中 发现 ctrl f 搜索一个项目文件夹中的结果的时候 搜索数字没有问题 能出来结果 但是搜索中文就会出不来结果 明明确认是有相关中文
  • lapack++与sba的编译问题

    最近在研究老外写的sba的程序 从http users ics forth gr lourakis sba 下载的sba程序是源代码 并没有编译 按照http blog csdn net royalvane article details
  • Apache Tomcat 8.5解压版在Win10系统安装详细过程说明

    目录 引言 一 操作环境 二 Tomcat安装 1 Tomcat安装版介绍 2 Tomcat解压版 绿色版 安装与环境变量配置 1 下载Tomcat8 5解压版压缩包 2 对压缩包进行解压 3 配置环境变量 CATALINA HOME 和
  • Docker基本知识笔记(五)--Docker Swarm

    目录 一 工作模式 二 搭建集群 三 Raft协议 四 Docker Stack 五 总结 一 工作模式 主要是分成两种节点 一个管理节点 一个工作节点 操作在管理节点上 二 搭建集群 四台阿里云服务器 1 配置管理节点 配置自己的ip地址
  • 高德地图弹框引用VUE组件

    1 高德地图版本 2 0 2 实现效果 3 代码如下 地图页面代码 var infoWindow new SimpleInfoWindow 基点指向marker的头部位置 offset new AMap Pixel 0 10 params
  • jdbc 连接Oracle RAC

    jdbc连接oracle的连接串如下 String url jdbc oracle thin DESCRIPTION ADDRESS PROTOCOL TCP HOST host2 PORT 1521 ADDRESS PROTOCOL TC
  • PowerDesigner165安装

    PowerDesigner安装及解析 一 PowerDesigner安装 1 双击开始安装 2 一路 Next 3 选择地区 4 安装路径 5 按图勾选 6 一路 Next 7 安装中 8 安装完成 二 解析 三 使用 一 PowerDes
  • MySQL 是怎样使用的:从零蛋开始学习 MySQL

    小册介绍 不论您是Javaer Phper Goer Pythoner 只要您是敲业务代码的 就离不开数据库 而MySQL凭借着它还不错的性能 还不错的稳定性常年稳居数据库排行榜老二宝座 当然最大的优势就是它不要钱 还开源 这让它成为大部分
  • Web自动化测试02:Web自动化测试工具选择大全

    系列文章目录 软件测试功能到自动化学习路线图 2022年最新版技术栈 软件测试01 从了解测试岗位职能和测试流程开始 附作业 软件测试02 6大实际案例手把手教你设计测试点 软件测试03 用例执行以及缺陷管理的学习 附禅道下载使用流程 软件
  • 三维点云质心与三角化 — python open3d

    本文为博主原创文章 未经博主允许不得转载 本文为专栏 python三维点云从基础到深度学习 系列文章 地址为 https blog csdn net suiyingy article details 124017716 1 质心介绍 质心概
  • C语言进阶(程序环境和预处理)

    目录 前言 一 程序的翻译环境和运行环境 1 程序的翻译环境 链接阶段 2 执行环境 运行环境 二 预处理详解 1 预定义符号 2 define定义标识符 3 define定义宏 define 替换规则 和 两个预处理的工具 4 带副作用的
  • Android面向面试复习----Bitmap

    Android中的Bitmap 1 recycle方法 该方法是系统提供的 可以用来回收bitmap占用的堆内存以及native内存 同时清除该对象的引用 该操作不可逆 如果调用了recycle 再次加载图片 则会抛出异常 所以 需要确保该
  • darknet优化经验-AlexeyAB大神经验

    目录 darknet优化经验 1 AlexeyAB改进项 2 Linux下编译选项 3 训练经验 4 提升检测效果 5 总结 6 AlexeyAB大神改进 darknet优化经验 主要来自于 AlexeyAB 版本darknet 1 Ale
  • QT的使用(学习笔记3)

    Containers Group Box 用于分组 Scroll Area 滚动部件 Tool Box 列表窗口 改名 在属性栏下方 找currentItemText 每个窗口可放不同部件 Tab Widget 标签窗口 同Tool Box
  • Java集合面试题(总结最全面的面试题)

    小伙伴们有兴趣想了解更多相关学习资料请点赞收藏 评论转发 关注我之后私信我 注意回复 000 即可获取更多免费资料 集合容器概述 什么是集合 集合就是一个放数据的容器 准确的说是放数据对象引用的容器 集合类存放的都是对象的引用 而不是对象的
  • [USACO06FEB]Steady Cow Assignment G【二分+最大流】

    题目链接 P2857 USACO06FEB Steady Cow Assignment G 有N头牛 B个牛棚 告诉你每头牛心里牛棚的座次 即哪个牛棚他最喜欢 哪个第2喜欢 哪个第3喜欢 等等 但牛棚容量一定 所以每头牛分配到的牛棚在该牛心