【JOJ 2453】Candy

Description

有N 颗糖果和M 个小孩,老师现在要把这N 颗糖分给这M 个小孩。每个小孩i对每颗糖j 都有一个偏爱度Aij,如果他喜欢这颗糖,Aij = 2,否则 Aij = 1。小孩 i觉得高兴当且仅当∑Cij×Aij >= Bi,j=1,2, …,N ,若他分得了糖 j ,Cij = 1,否则 Cij = 0。问能否合理分配这 N 颗糖,使得每个小孩都觉得高兴。(1 <= N <= 100,000, 1 <= M <= 10, 0 <= Bi <= 1,000,000,000)

Input

多组数据
首先T,表示数据组数。
每组数据里面,第一行n,m
然后n行每行m个
表示第i个糖果对于第j个小朋友的价值
最后m行,表示b[];

Output

"Yes" OR "No",每组数据换行输出;

Sample Input

5
10 5
2 2 1 2 1 
2 1 2 1 2 
1 2 2 2 1 
2 1 2 1 1 
1 2 1 1 1 
1 1 2 2 2 
1 1 1 2 2 
1 1 1 2 2 
2 1 1 1 1 
1 1 2 1 2 
1 1 2 1 2 
10 5
2 2 2 2 1 
2 1 1 1 2 
2 1 1 2 1 
2 1 2 1 2 
1 2 1 2 1 
2 1 2 2 1 
1 2 1 1 2 
1 2 2 1 1 
2 2 1 2 1 
1 2 2 1 1 
3 2 2 3 3 
10 5
1 1 2 1 1 
1 2 2 1 2 
2 2 2 1 2 
1 1 1 2 1 
1 2 2 1 1 
1 1 1 2 1 
1 1 2 1 1 
1 1 2 1 2 
2 2 1 1 1 
1 1 1 1 1 
3 2 3 2 2 
10 5
1 1 1 2 1 
1 1 1 1 1 
1 1 2 2 1 
2 1 2 1 1 
1 1 1 1 1 
2 2 2 2 2 
1 2 2 2 1 
2 1 2 2 1 
2 1 1 2 2 
1 1 1 1 2 
1 3 2 3 3 
10 5
2 1 2 2 2 
1 1 1 2 2 
2 1 1 1 2 
2 2 1 1 1 
2 2 2 1 2 
1 1 1 1 1 
2 2 1 2 1 
2 2 1 1 2 
1 2 1 1 2 
2 1 2 2 2 
1 2 3 3 3 

Sample Output

Yes
Yes
Yes
Yes
Yes

Solution

我们的网络流之中,流量并不能根据前方需要的流量而给出相应的价值。
也就是说,一颗糖果既有可能价值为1又有可能价值为2的情况在最大流中
是不存在的。
但是我们唯一可以判别的就是价值为0和价值为1的两种情况了。因为我们
将每一颗糖果的价值定为1那么我们就可以通过不选取这颗糖果的方式使其
价值变为0。
我们再限制每一个孩子能够得到的糖果的个数为自己所需的上限,因为多得
到的糖果实际上对此题毫无意义,是属于浪费的行为。
我们将糖果价值变为0或1之后的最大流其实是每一个孩子得到的2价糖果总
数,所以孩子的流量限制为所需个数的一半。
这时候我们将最大流与糖果总数相加,如果能够满足总的需求,那么就一定
存在一种符合要求的分配方案。
但是我们还会发现糖果总数非常的大,刚才我们讲述的建图方式一定会超时。
因为我们可以把去向完全相同的点合并成为一个点,加上最多只有十个孩子,
那么最多存在2^10种糖,就大大减少了糖的个数 。
将一颗糖转化为二进制数,2代表1,1代表0。从源点向每一种糖连边,价值为
重复次数,将其取出后按位连边。 
建图:
st--> i,flow=mark[i]
i--> kid,flow=mark[i]
kid--> ed,flow=floor(sum[kid]/2)

CODE

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int inf=0x3f3f3f3f;
inline int read(){char c;int rec=0;while((c=getchar())<'0'||c>'9');while(c>='0'&&c<='9')rec=rec*10+c-'0',c=getchar();return rec;
}
struct Hose {int next,to,flow;}hose[50005];
int h[2005],cnt;
inline void add(int x,int y,int z){hose[++cnt].to=y;hose[cnt].next=h[x];h[x]=cnt;hose[cnt].flow=z;hose[++cnt].to=x;hose[cnt].next=h[y];h[y]=cnt;hose[cnt].flow=0;return ;
}
int mark[2005];
int n,m,T,N,x,ans,sum=0;
int st,ed;
int Gap[2005],dis[2005];
inline int SAP(int v,int maxflow){if(v==ed)return maxflow;int temp=maxflow,i,j,p;for(i=h[v];i;i=hose[i].next){j=hose[i].to;if(hose[i].flow&&dis[v]==dis[j]+1){p=SAP(j,min(temp,hose[i].flow));temp-=p;hose[i].flow-=p;hose[i^1].flow+=p;if(temp==0||dis[st]==N)return maxflow-temp;}}if(--Gap[dis[v]]==0)dis[st]=N;else Gap[++dis[v]]++;return maxflow-temp;
}
inline void Clean(){memset(h,0,sizeof(h));memset(mark,0,sizeof(mark));memset(Gap,0,sizeof(Gap));memset(dis,0,sizeof(dis));ans=0;cnt=1;sum=0;return ;
}
int main(){T=read();while(T--){Clean();n=read();m=read();st=0;ed=2005;N=n+m+2;for(int i=1;i<=n;i++){int a=0;for(int j=1;j<=m;j++){x=read();a=a<<1|(x==2);}mark[a]++;}for(int i=1;i<=1024;i++){if(mark[i]){add(st,i+m,mark[i]);for(int j=1;j<=m;j++)if(i>>(j-1)&1)add(i+m,j,mark[i]);//非常尴尬。。。前面的i一直被写成了mark[i]... }}for(int i=1;i<=m;i++){x=read();add(i,ed,x>>1);sum+=x;}Gap[0]=N;while(dis[st]<N)ans+=SAP(st,inf);if(sum<=n+ans)cout<<"Yes\n";else cout<<"No\n";}return 0;
}

JOJ 2453 Candy相关推荐

  1. 网络流建模汇总(转自Edelweiss)

    最大流 <POJ 1149    PIGS> [题目大意] 有 M 个猪圈,每个猪圈里初始时有若干头猪.一开始所有猪圈都是关闭的.依 次来了 N  个顾客,每个顾客分别会打开指定的几个猪圈 ...

  2. [LeetCode]135.Candy

    [题目] There are N children standing in a line. Each child is assigned a rating value. You are giving ...

  3. LeetCode之Candy

    [题目] There areNchildren standing in a line. Each child is assigned a rating value. You are giving ca ...

  4. Animated Eye Candy for Programmers

    作者采用vs2008编译,c#代码 Animated Eye Candy for Programmers By Phillip Piper | 17 Apr 2010 A class library ...

  5. Bzoj 2453: 维护队列 Bzoj 2120: 数颜色 分块,bitset

    2453: 维护队列 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 578  Solved: 247 [Submit][Status][Discus ...

  6. 天题系列: Candy

    排排坐分果果,这道题还是蛮难想的,答案忘了从哪里看的了 public int candy(int[] ratings) {if(ratings == null) return 0;int len = ...

  7. AGC002E Candy Piles

    AGC002E Candy Piles 有n堆石子,每堆石子有aia_iai​个,两人轮流操作.要么取走石子最多的一堆,要么将每堆石子取走1个.谁取走最后1个石子,谁就输了.假设两人都足够聪明,求先手 ...

  8. leetcode 135. Candy | 135. 分发糖果(原创图文详解,Java)

    题目 https://leetcode.com/problems/candy/ 题解 思路 首先,根据题意,这是一个分糖果问题.本题需要满足两个条件: 每个孩子至少有一个糖果 rating 值较大的孩 ...

  9. LeetCode OJ - Candy

    题目: There are N children standing in a line. Each child is assigned a rating value. You are giving c ...

最新文章

  1. 北大数院校友最新成果登数学四大顶刊,偏微分方程突破,可用于W-GAN,现已回国任教中科大...
  2. 数据绑定(三)为Binding指定绑定源的几种方法
  3. exchange系列(四)如何保护exchange邮件服务器的安全
  4. C语言实现TCP网络通信(附服务端和客服端完整源码)
  5. android listview左滑删除
  6. MFC中动态数组CArray的使用
  7. Mybatis中的updateByPrimaryKeySelective()和updateByPrimaryKey()
  8. php 三元预算? :_项目预算:一种反模式
  9. HTTP面试题 ——TCP
  10. 苹果AirPods 2又有新消息了!具备防滑涂层和新配色
  11. ubuntu16.04 apt-get update出错:由于没有公钥,无法验证下列签名
  12. IntelliJ IDEA 自定义控制台输出多颜色格式功能 --- 安装Grep Console插件
  13. python随机森林库_随机森林库:R和Python中的不同结果
  14. wps2019计算机里的云盘,WPS2019云文档如何使用?
  15. SDIO接口简单描述
  16. c语言 x%2 什么意思,《X》歌词 printf((x%2)?**%d:##%d\n,x);是什么意思?
  17. 初探 Redis 客户端 Lettuce:真香!
  18. android日记app常用,这款知名极简日记 APP,终于有了 Android 版!
  19. 解题报告 (十三) 尺取法
  20. buck电路 dac stm32_嵌入式设计-基于STM32F334的BUCK同步降压数字电源设计-电路城论坛 - 电子工程师学习交流园地...

热门文章

  1. 【杂谈】关于个人档案的机要邮寄
  2. Java HotSpot 虚拟机选项 -X -XX 的含义
  3. 三菱FX3U/FX1N底层源码,PLSR源码, 总体功能和指令可能支持在RUN中下载程序,支持注释的写入和读取,支持脉冲输出与定位指令(包括PLSY /PWM/PLSR/PLSV/DRVI /DRV
  4. 二、TensorFlow2.x 基于图像的分类
  5. pixfllow光流传感器数据获取及悬停程序编写
  6. 解决word,ppt,excel图标为空白(适用于新电脑)
  7. 工厂生产管理系统如何解决车间生产管理难题?
  8. python拼图游戏代码的理解_Python编写的数字拼图游戏(含爬山算法人机对战功能)...
  9. halcon算法库中各坐标系,位姿的解释及原理
  10. 罗永浩做直播一年能挣多少钱?