HDU-3315 My Brute

先对于每种可能的PK情况进行判断胜负,然后求最小改动最大匹配。

#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <fstream>
#include <iostream>
#include <cctype>
#define rep(i, l, r) for(int i=l; i<=r; i++)
#define clr(x, c) memset(x, c, sizeof(x))
#define MAX 0x3fffffff
#define N 100
using namespace std;
int read()
{
	int x=0; char ch=getchar();
	while (!isdigit(ch)) ch=getchar();
	while (isdigit(ch)) { x=x*10+ch-‘0‘; ch=getchar(); }
	return x;
}

int n, l[N], st[N], lx[N], ly[N], v[N][N], a1[N], a2[N], hp1[N], hp2[N], p[N];
bool vx[N], vy[N];

inline int pk(int x, int y)
{
	int c=min((hp1[x]-1)/a2[y], (hp2[y]-1)/a1[x])+1;
	if (c*a1[x]>=hp2[y]) return p[x]; else return -p[x];
}

bool Find(int x)
{
	vx[x]=1;
	rep(y, 1, n) if (!vy[y])
	{
		int a=lx[x]+ly[y]-v[x][y];
		if (!a)
		{
			vy[y]=1; if (!l[y] || Find(l[y])) { l[y]=x; return 1; }
		}
		else st[y]=min(st[y], a);
	}
	return 0;
}

inline int km()
{
	clr(ly, 0); clr(l, 0); rep(i, 1, n) lx[i]=-MAX;
	rep(i, 1, n) rep(j, 1, n) if (lx[i]<v[i][j]) lx[i]=v[i][j];
	rep(i, 1, n)
	{
		rep(j, 1, n) st[j]=MAX;
		while (1)
		{
			clr(vx, 0); clr(vy, 0);
			if (Find(i)) break; int a=MAX;
			rep(j, 1, n) if (!vy[j] && a>st[j]) a=st[j];
			rep(j, 1, n) if (vx[j]) lx[j]-=a;
			rep(j, 1, n) if (vy[j]) ly[j]+=a; else st[j]-=a;
		}
	}
	int a=0;
	rep(i, 1, n) a+=lx[i]+ly[i];
	return a;
}

int main()
{
	while (~scanf("%d", &n) && n)
	{
		rep(i, 1, n) p[i]=read();
		rep(i, 1, n) hp1[i]=read();
		rep(i, 1, n) hp2[i]=read();
		rep(i, 1, n) a1[i]=read();
		rep(i, 1, n) a2[i]=read();
		rep(i, 1, n) rep(j, 1, n) v[i][j]=pk(i, j);
		rep(i, 1, n) rep(j, 1, n) v[i][j]*=N, v[i][j]+=i==j?1:0;
		int ans=km(); double k=ans%N;
		if (ans>0) printf("%d %.3lf%%\n", ans/N, k/n*100); else printf("Oh, I lose my dear seaco!\n");
	}
	return 0;
}

  

时间: 2024-08-25 04:14:34

HDU-3315 My Brute的相关文章

HDU 3315 My Brute(KM最大匹配)

HDU 3315 My Brute 题目链接 和HDU2835是一样的思路,利用把数字离散掉来多判断一个优先级 代码: #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; const int MAXNODE = 105; typedef int Type; const Type INF = 0x3f3f3f3f; str

hdu 3315 My Brute 费用流,费用最小且代价最小

很常见的想法了= = #include <stdio.h> #include <iostream> #include <string.h> using namespace std; const int N=400; const int MAXE=200000; const int inf=1<<30; int head[N],s,t,cnt,n,m,ans; int d[N],pre[N]; bool vis[N]; int q[MAXE]; int V[N

HDU 3315 My Brute(费用流)

题目地址:HDU 3315 这个题的思路完全是自己想出来的,自我感觉挺巧妙的...(大牛勿喷...)对大胆建图又多了一份信心. 具体思路是构造一个二分图,Si连源点,Xi连汇点,流量都是1,费用0.然后当Si可以赢Xj的时候,就对这两人连一条边,费用值为-Vi*1000,如果i==j的话,费用值就再减1,因为题目要求尽量不改变原先的顺序,所以说应该尽量让序号相同的对打.而费用值减1的话,会优先考虑序号相同的,而且让费用扩大了1000倍,此时也不会改变主要的分数因素大小.同理,输的话,费用值为Vi

HDU 2853 &amp;&amp; HDU 3315

http://acm.hdu.edu.cn/showproblem.php?pid=2853 题意:给一个n-m二分图,边权用一个n*m的矩阵表示,给出初始匹配,求二分图完美匹配相比初始匹配改变了几条边以及改变的数值 这类题的主要思想是增加原配边的权值,但又不影响最后结果. 步骤1:观察顶点数,每条边乘一个大于顶点数的数v 步骤2:对于原配边,每边加1(注意步骤2可以保证km()/v的结果与原结果相同) 步骤3:求完美匹配,答案为res,改变的边数=n-res%v(res%v表示完美匹配中有多少

HDU 3315 KM My Brute

参考题解 二分图的最优匹配.图很容易建立.再处理相似度的时候.把每个权值扩大100倍.然后再对i==j时 特殊标记.使他们的权值再++1.后面选择的时候就很容易挑出.按原匹配 匹配的个数. 100*(double)(res%100)/n.即可得到第二问. 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 #include <ve

HDU 3316 My Brute(二维费用流)经典

My Brute Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 941    Accepted Submission(s): 372 Problem Description Seaco is a beautiful girl and likes play a game called "My Brute". Before Va

HDU 3316 My Brute(二维费用流)

My Brute Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 941    Accepted Submission(s): 372 Problem Description Seaco is a beautiful girl and likes play a game called "My Brute". Before Va

【图论】二分图匹配总结

二分图匹配总结 二分图匹配 1.二分图最大匹配.求两个集合内,每一个元素仅仅能用一次.两集合间存在一些匹配关系,求最大匹配多少对,利用匈牙利算法,对于每一个结点不断去找增广路去匹配 有几个重要性质: 1.最小点覆盖 = 最大匹配 2.最大独立集 = 总结点 - 最大匹配 模板: bool dfs(int u) { for (int i = 0; i < g[u].size(); i++) { int v = g[u][i]; if (vis[v]) continue; vis[v] = 1; i

图论 500题——主要为hdu/poj/zoj

转自——http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并查集======================================[HDU]1213   How Many Tables   基础并查集★1272   小希的迷宫   基础并查集★1325&&poj1308  Is It A Tree?   基础并查集★1856   More i

hdu图论题目分类

=============================以下是最小生成树+并查集====================================== [HDU] 1213 How Many Tables 基础并查集★ 1272 小希的迷宫 基础并查集★ 1325&&poj1308 Is It A Tree? 基础并查集★ 1856 More is better 基础并查集★ 1102 Constructing Roads 基础最小生成树★ 1232 畅通工程 基础并查集★ 123