HDU 3315 My Brute(二分图最佳匹配+尽量保持原先匹配)
http://acm.hdu.edu.cn/showproblem.php?pid=3315
题意:
有S1到Sn这n个勇士要和X1到Xn这n个勇士决斗,初始时,Si的决斗对象是Xi. 如果Si赢了Xi,那么你将获得Vi分,否则你将获得-Vi分. Si和Xi对决时,Si有初始生命Hi,初始攻击Ai, Xi有初始生命Pi,初始攻击Bi. 且Si先出手,然后Xi失去Ai生命,之后如果Xi没死,那么Xi出手,Si失去Bi生命. 直到有一方的生命值<=0时,决斗结束.
现在要你重新安排S和X的决斗顺序,使得你能获得的分最多.如果有多个最优解,你要选取那个维持初始决斗顺序最多的解。
思路:
这道题目就是一个二分图的最佳完美匹配。
对于题目要求的维持初始决斗顺序最多的解,先将每条边的权值扩大1000倍,如果该边是原来的匹配的话,则在自加1。扩大这么多倍的原因是为了维持原先的大小关系。这样一来就会优先选择原先匹配。
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<sstream>
#include<vector>
#include<stack>
#include<queue>
#include<cmath>
#include<map>
#include<set>
using namespace std;
typedef long long ll;
typedef pair<int,int> pll;
const int INF = 0x3f3f3f3f;
const int maxn = + ; struct Max_Match
{
int n;
int W[maxn][maxn];
int Lx[maxn],Ly[maxn]; //顶标
bool S[maxn],T[maxn]; //S[i]和T[i]左/右第i个点是否已标记
int left[maxn]; //left[i]为右边第i个点的编号 bool match(int i)
{
S[i]=true;
for(int j=;j<=n;j++) if(Lx[i]+Ly[j]==W[i][j] && !T[j])
{
T[j]=true;
if(left[j]==- || match(left[j]))
{
left[j]=i;
return true;
}
}
return false;
} void update()
{
int a=<<;
for(int i=;i<=n;i++)if(S[i])
for(int j=;j<=n;j++)if(!T[j])
a=min(a, Lx[i]+Ly[j]-W[i][j]);
for(int i=;i<=n;i++)
{
if(S[i]) Lx[i] -=a;
if(T[i]) Ly[i] +=a;
}
} int solve(int n)
{
this->n=n;
memset(left,-,sizeof(left));
for(int i=;i<=n;i++)
{
Lx[i]=Ly[i]=;
for(int j=;j<=n;j++)
Lx[i]=max(Lx[i], W[i][j]);
} for(int i=;i<=n;i++)
{
while(true)
{
memset(S,,sizeof(S));
memset(T,,sizeof(T));
if(match(i)) break;
else update();
}
}
//计算最大权值和
int ans=;
for(int i=;i<=n;i++) ans+=W[left[i]][i];
return ans;
}
}KM; int n;
int v[maxn];
int h[maxn],p[maxn];
int a[maxn],b[maxn]; int judge(int i,int j)
{
int hpi=h[i],hpj=p[j];
while(hpi && hpj)
{
hpj-=a[i];
if(hpj<=) return v[i];
hpi-=b[j];
if(hpi<=) return -v[i];
}
} int main()
{
//freopen("in.txt","r",stdin);
while(~scanf("%d",&n) && n)
{
for(int i=;i<=n;i++) scanf("%d",&v[i]);
for(int i=;i<=n;i++) scanf("%d",&h[i]);
for(int i=;i<=n;i++) scanf("%d",&p[i]);
for(int i=;i<=n;i++) scanf("%d",&a[i]);
for(int i=;i<=n;i++) scanf("%d",&b[i]); for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
{
KM.W[i][j]=judge(i,j);
KM.W[i][j]*=;
if(i==j) KM.W[i][j]+=;
} int ans = KM.solve(n);
if(ans/<=) puts("Oh, I lose my dear seaco!");
else
{
printf("%d %.3f%%\n",ans/,.*(ans%)/n);
}
}
return ;
}
HDU 3315 My Brute(二分图最佳匹配+尽量保持原先匹配)的更多相关文章
- HDU 3315 My Brute(费用流)
职务地址:HDU 3315 这个题的思路全然是自己想出来的,自我感觉挺巧妙的. . .(大牛勿喷.. . )对大胆建图又多了一份信心. 详细思路是构造一个二分图,Si连源点.Xi连汇点,流量都是1,费 ...
- Python 基础之正则之一 单字符,多字符匹配及开头结尾匹配
一.正则表达式之单个字符匹配 格式:lst = re.findall(正则表达式,要匹配的字符串)预定义字符集 匹配内容 .匹配任意字符,除了换行符\n \d匹配数字 \D匹配非数字 \w匹配字母或数 ...
- HDU2255 奔小康赚大钱【二分图最佳匹配】
题目链接: http://acm.hdu.edu.cn/showproblem.php? pid=2255 题目大意: 村里要分房子. 有N家老百姓,刚好有N间房子.考虑到每家都要有房住,每家必须分配 ...
- UVa 11383 少林决胜(二分图最佳完美匹配)
https://vjudge.net/problem/UVA-11383 题意: 给定一个N×N矩阵,每个格子里都有一个正整数W(i,j).你的任务是给每行确定一个整数row(i),每列也确定一个整数 ...
- UVa1349 Optimal Bus Route Design(二分图最佳完美匹配)
UVA - 1349 Optimal Bus Route Design Time Limit: 3000MS Memory Limit: Unknown 64bit IO Format: %lld & ...
- hdu3488 Tour 拆点+二分图最佳匹配
In the kingdom of Henryy, there are N (2 <= N <= 200) cities, with M (M <= 30000) one-way r ...
- hdu2255 奔小康赚大钱 二分图最佳匹配--KM算法
传说在遥远的地方有一个非常富裕的村落,有一天,村长决定进行制度改革:重新分配房子.这可是一件大事,关系到人民的住房问题啊.村里共有n间房间,刚好有n家老百姓,考虑到每家都要有房住(如果有老百姓没房子住 ...
- UVa 1349 - Optimal Bus Route Design(二分图最佳完美匹配)
链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- Ants(二分图最佳完美匹配)
Ants Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 6904 Accepted: 2164 Special Ju ...
随机推荐
- mysql优化之explain备忘笔记
今天使用explain来查看sql执行情况的时候发现有的东西忘掉了,故作此篇文章来强化此知识点的记忆. 1.explain作用 exlain 执行结果显示了mysql 存储引擎如何使用索引来处理sel ...
- c# Use NAudio Library to Convert MP3 audio into WAV audio(将Mp3格式转换成Wav格式)
Have you been in need of converting mp3 audios to wav audios? If so, the skill in this article prov ...
- java如何发起https请求
1.写一个SSLClient类,继承至HttpClient import java.security.cert.CertificateException; import java.security.c ...
- maven的install和deploy的区别
转自:http://blog.csdn.net/u011305680/article/details/51699471 maven package:打包到本项目,一般是在项目target目录下.如果a ...
- AB压力测试工具
1.安装AB工具: yum install httpd-tools 2.测试: ab -n -c http://localhost.com/ 其中-n表示请求数,-c表示并发数 3.测试结果 [roo ...
- windows dos 常用命令行
有关某个命令的详细信息,请键入 HELP 命令名 dir (directory) :列出当前目录下的文件以及文件夹 md (make directory): 创建目录 rd (remove direc ...
- pta 天梯地图 (Dijkstra)
本题要求你实现一个天梯赛专属在线地图,队员输入自己学校所在地和赛场地点后,该地图应该推荐两条路线:一条是最快到达路线:一条是最短距离的路线.题目保证对任意的查询请求,地图上都至少存在一条可达路线. 输 ...
- 一个不需要Log4Net的写日志的简单方法
有些项目写日志时会选择大名鼎鼎的Log4Net.而在我们使用它时,总会出现一些诸如版本不匹配而造成的写日志失败的情况,还要改web.config,还要改AssemblyInfo.而且,它的失败,并不是 ...
- Token Based Authentication -- Implementation Demonstration
https://www.w3.org/2001/sw/Europe/events/foaf-galway/papers/fp/token_based_authentication/
- windows下安装redis(转)
add by zhj: redis相比memcached相比,性能上并没有绝对的优势.我们用redis的是因为它支持更多的数据类型,而且在分配给redis的内存用满了之后, redis也不会删除没有过 ...