CF 321B Ciel and Duel(费用流)
题目链接:http://codeforces.com/problemset/problem/321/B
题意:两个人,分别有n、m张牌。每张牌有两个属性类型和能力,类型为攻击或者防守。B的m张牌的属性均为攻击。模拟以下过程:
(1)B所有的牌都使用过,结束;否则,B此时想要结束则结束,不想结束转(2);
(2)B从自己未使用过的牌中选出一张,设其能力值为X,转(3);
(3)A所有牌都使用过,A受到的伤害值为X,转(1);否则转(4);
(4)B从A未使用过的牌中选出一张,设其能力值为Y,若这张牌类型为攻击,能当X>=Y时,此轮进行,A受到伤害值X-Y;若类型为防守,则当X>Y时此轮进行,A不受到伤害。此轮一旦进行,结束后两个人使用的牌均标记使用过。转(1)。
帮助B设计一个方案使得A受到的伤害值最大?
思路:使用费用流,三个问题:
(1)A在使用完所有牌后若B还有剩余则那些剩余牌的伤害值才能加入答案;也就是若A还有牌要先保证使用完A的牌
(2)B在任意时刻可以决定结束;
(3)此题是求最大值,而费用流是求最小费用;
我们这样建图,A的n张牌拆开,编号i和i+n,B的m张牌编号n+n+1到n+n+m,增加原点S=n+n+m+1,t=n+n+m+2。
(1)(i,i+n,1,-2*INF),(i+n,T,1,0),费用-INF*2,保证一定在答案中;(1<=i<=n)
(2)(0,n+n+i,1,0); (1<=i<=m)
(3)(n+n+i,j,1,INF-(Xi-Yj))(攻击型),(n+n+i,j,1,INF)(防守型),最大改最小,符合最小费用,1<=i<=m,1<=j<=n
(4)(n+n+i,T,1,INF),A用完之后剩下的B直接加入答案;
(5)(S,0,x,0)这里的x是枚举的,枚举1到m,代表B在任意时刻可以决定是否结束。
计算最小费用后转换为实际答案就好。
struct node { int u,v,flow,next; i64 cost; }; node edges[N]; int head[N],e; void add(int u,int v,int flow,i64 cost) { edges[e].u=u; edges[e].v=v; edges[e].flow=flow; edges[e].cost=cost; edges[e].next=head[u]; head[u]=e++; } void Add(int u,int v,int flow,i64 cost) { add(u,v,flow,cost); add(v,u,0,-cost); } int pre[N],F[N],visit[N],s,t; i64 C[N]; int SPFA(int s,int t) { int i; for(i=0;i<=t;i++) C[i]=inf*1000,F[i]=0,visit[i]=0; queue<int> Q; Q.push(s); C[s]=0; F[s]=INF; int u,v,f; i64 c; while(!Q.empty()) { u=Q.front(); Q.pop(); visit[u]=0; for(i=head[u];i!=-1;i=edges[i].next) { v=edges[i].v; f=edges[i].flow; c=edges[i].cost; if(f>0&&C[v]>C[u]+c) { C[v]=C[u]+c; F[v]=min(F[u],f); pre[v]=i; if(!visit[v]) Q.push(v),visit[v]=1; } } } return F[t]; } i64 MCMF(int s,int t) { i64 ans=0; int i,temp,x; while(temp=SPFA(s,t)) { for(i=t;i!=s;i=edges[pre[i]].u) { x=pre[i]; ans+=temp*edges[x].cost; edges[x].flow-=temp; edges[x^1].flow+=temp; } } return ans; } string S[105]; int a[105],b[105],n,m; i64 cal(int x) { int i,j; s=n+n+m+1; t=n+n+m+2; clr(head,-1); e=0; FOR1(i,n) Add(i,n+i,1,-2*inf); FOR1(i,n) Add(n+i,t,1,0); FOR1(i,m) Add(0,n+n+i,1,0); Add(s,0,x,0); FOR1(i,m) { FOR1(j,n) { if(S[j]=="ATK") { if(b[i]>=a[j]) Add(n+n+i,j,1,inf-(b[i]-a[j])); } else { if(b[i]>a[j]) Add(n+n+i,j,1,inf); } } } FOR1(i,m) Add(n+n+i,t,1,inf-b[i]); i64 ans=MCMF(s,t); ans=ans+2*inf*min(x,n); ans=x*inf-ans; return ans; } int main() { RD(n,m); int i; FOR1(i,n) RD(S[i]),RD(a[i]); FOR1(i,m) RD(b[i]); i64 ans=0; for(i=1;i<=m;i++) { ans=max(ans,cal(i)); } PR(ans); return 0; }
CF 321B Ciel and Duel(费用流)的更多相关文章
- CF:322D - Ciel and Duel 贪心 或者 DP 我用的贪心 。。难道sort跟qsort是不一样的么?
D. Ciel and Duel time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...
- CF 277E Binary Tree on Plane (拆点 + 费用流) (KM也可做)
题目大意: 平面上有n个点,两两不同.现在给出二叉树的定义,要求树边一定是从上指向下,即从y坐标大的点指向小的点,并且每个结点至多有两个儿子.现在让你求给出的这些点是否能构成一棵二叉树,如果能,使二叉 ...
- 【CF280D】 k-Maximum Subsequence Sum ,线段树模拟费用流
昨天考试被教育了一波.为了学习一下\(T3\)的科技,我就找到了这个远古时期的\(cf\)题(虽然最后\(T3\)还是不会写吧\(QAQ\)) 顾名思义,这个题目其实可以建成一个费用流的模型.我们用流 ...
- CSU 1948: 超级管理员(普通费用流&&zkw费用流)
Description 长者对小明施加了膜法,使得小明每天起床就像马丁的早晨一样. 今天小明早上醒来发现自己成了一位仓管员.仓库可以被描述为一个n × m的网格,在每个网格上有几个箱子(可能没有).为 ...
- bzoj1834: [ZJOI2010]network 网络扩容 费用流
bzoj1834 给定一张有向图,每条边都有一个容量C和一个扩容费用W.这里扩容费用是指将容量扩大1所需的费用. 求: 1.在不扩容的情况下,1到N的最大流: 2.将1到N的最大流增加K所需的最小扩容 ...
- BZOJ2673 [Wf2011]Chips Challenge 费用流 zkw费用流 网络流
https://darkbzoj.cf/problem/2673 有一个芯片,芯片上有N*N(1≤N≤40)个插槽,可以在里面装零件. 有些插槽不能装零件,有些插槽必须装零件,剩下的插槽随意. 要求装 ...
- BZOJ2055 80人环游世界 网络流 费用流 有源汇有上下界的费用流
https://darkbzoj.cf/problem/2055 https://blog.csdn.net/Clove_unique/article/details/54864211 ←对有上下界费 ...
- Codeforces 708D 上下界费用流
给你一个网络流的图 图中可能会有流量不平衡和流量>容量的情况存在 每调整一单位的流量/容量 需要一个单位的花费 问最少需要多少花费使得原图调整为正确(可行)的网络流 设当前边信息为(u,v,f, ...
- hdu-5988 Coding Contest(费用流)
题目链接: Coding Contest Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Ot ...
随机推荐
- 解决windows的控制台显示utf8乱码的问题
在控制台的属性里 修改自体为: 新宋体 在控制台下执行命令: chcp 65001
- [php]表单和验证
<?php /* 表单的作用: 通过表单 发布和收集 信息. 对html表单进行编码 只是有效接受用户输入的必要操作的(一部分), 必须由[服务器端]组件来处理 一 标头函数(header()) ...
- 修改linux下mysql目录权限
1.进入当前目录:例cd /srun3/mysql 2.修改权用户限 chown -R mysql ipt_authd_remote(表示给ipt_authd_remotemysql权限) 3.修改用 ...
- android 学习随笔二十三(动画:Fragment )
Fragment * 用途:在一个Activity里切换界面,切换界面时只切换Fragment里面的内容 * 在一个Activity中切换多个界面,每个界面就是一个Fragment* Fragmnen ...
- javaWeb 使用jsp标签进行防盗链
/** * 1.新建类继承SimpleTagSupport * 新建2个属性, 添加对应的set方法 * 覆盖doTag()方法 */ import java.io.IOException; impo ...
- Java中Properties类的使用
1.properties介绍 java中的properties文件是一种配置文件,主要用于表达配置信息,文件类型为*.properties,格式为文本文件,文件的内容是格式是"键=值&quo ...
- html5 canvas 笔记一(基本用法与绘制图形)
<canvas> 元素 <canvas id="tutorial" width="150" height="150"> ...
- gets()和getchar()还有getch()的区别
getch()和getchar()区别:1.getch(): 所在头文件:conio.h 函数用途:从控制台读取一个字符,但不显示在屏幕上例如: char ch;或int ch: getch();或c ...
- 关于基于webrtc的android-apk 和 webrtc-brows
这一段时间我在做一些关于基于webrtc应用的一些研究,做个一个android的demo,详情如下: 手机客户端: 基于webrtc的 android apk (webrtc 代码版本 R67 ...
- 【转】Eclipse插件大全介绍及下载地址
转载地址:http://developer.51cto.com/art/200906/127169.htm 尚未一一验证. eclipse插件大全介绍,以及下载地址 Eclipse及其插件下载网址大全 ...