【HDOJ】3315 My Brute
几乎与2853相同,Successive Shortest Path Algorithm(SSPA) 解费用流。
/* 3315 */
#include <iostream>
#include <string>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <vector>
#include <deque>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <ctime>
#include <cstring>
#include <climits>
#include <cctype>
#include <cassert>
#include <functional>
#include <iterator>
#include <iomanip>
using namespace std;
//#pragma comment(linker,"/STACK:102400000,1024000") #define sti set<int>
#define stpii set<pair<int, int> >
#define mpii map<int,int>
#define vi vector<int>
#define pii pair<int,int>
#define vpii vector<pair<int,int> >
#define rep(i, a, n) for (int i=a;i<n;++i)
#define per(i, a, n) for (int i=n-1;i>=a;--i)
#define clr clear
#define pb push_back
#define mp make_pair
#define fir first
#define sec second
#define all(x) (x).begin(),(x).end()
#define SZ(x) ((int)(x).size())
#define lson l, mid, rt<<1
#define rson mid+1, r, rt<<1|1 const int INF = 0x1f1f1f1f;
const int maxn = ;
const int maxv = maxn*;
const int maxe = maxv * maxv * ;
int V[maxe], F[maxe], W[maxe], nxt[maxe];
int head[maxv], pre[maxv], ID[maxv], dis[maxv], cnt[maxv];
bool visit[maxv];
int Hi[maxn], Pi[maxn], Ai[maxn], Bi[maxn], Vi[maxn];
int s, t, m; bool win(int i, int j) {
int c1 = (Pi[j] + Ai[i] - ) / Ai[i];
int c2 = (Hi[i] + Bi[j] - ) / Bi[j]; return c1 <= c2;
} void addEdge(int u, int v, int c, int w) {
V[m] = v;
F[m] = c;
W[m] = w;
nxt[m] = head[u];
head[u] = m++; V[m] = u;
F[m] = ;
W[m] = -w;
nxt[m] = head[v];
head[v] = m++;
} void Bellman_Ford(int st, int ed) {
int u, v, k;
queue<int> Q; memset(dis, INF, sizeof(dis));
memset(cnt, , sizeof(cnt));
memset(pre, -, sizeof(pre));
dis[st] = ;
cnt[st] = ;
Q.push(st); while (!Q.empty()) {
u = Q.front();
Q.pop();
cnt[u] = -cnt[u];
for (k=head[u]; k!=-; k=nxt[k]) {
v = V[k];
if (F[k] && dis[v]>dis[u]+W[k]) {
dis[v] = dis[u] + W[k];
ID[v] = k;
pre[v] = u;
if (cnt[v] <= ) {
cnt[v] = -cnt[v] + ;
Q.push(v);
}
}
}
}
} bool bfs(int st, int ed) {
Bellman_Ford(st, ed);
priority_queue<pii, vector<pii>, greater<pii> > Q;
int u, v, k; Q.push(make_pair(, st));
while (!Q.empty()) {
pii p = Q.top();
Q.pop();
u = p.second;
if (dis[p.second] > p.first) continue;
if (u == ed) break;
for (k=head[u]; k!=-; k=nxt[k]) {
v = V[k];
if (F[k] && dis[v]>dis[u]+W[k]) {
dis[v] = dis[u] + W[k];
ID[v] = k;
pre[v] = u;
Q.push(make_pair(dis[v], v));
}
}
} return pre[ed] == -;
} int MCMF(int s, int t) {
int ret = , tmp;
int u, v, k; while () {
if (bfs(s, t))
break; tmp = INF;
for (v=t, u=pre[v]; v!=s; v=u, u=pre[v]) {
k = ID[v];
tmp = min(F[k], tmp);
} for (v=t, u=pre[v]; v!=s; v=u, u=pre[v]) {
k = ID[v];
F[k] -= tmp;
F[k^] += tmp;
} ret += dis[t] * tmp;
} return ret;
} int main() {
ios::sync_with_stdio(false);
#ifndef ONLINE_JUDGE
freopen("data.in", "r", stdin);
freopen("data.out", "w", stdout);
#endif int n;
int ans, tmp; while (scanf("%d", &n)!=EOF && n) {
rep(i, , n+)
scanf("%d", &Vi[i]);
rep(i, , n+)
scanf("%d", &Hi[i]);
rep(i, , n+)
scanf("%d", &Pi[i]);
rep(i, , n+)
scanf("%d", &Ai[i]);
rep(i, , n+)
scanf("%d", &Bi[i]); s = m = ;
t = n + n + ;
memset(head, -, sizeof(head)); rep(i, , n+) {
rep(j, , n+) {
if (win(i, j)) {
if (i == j) {
tmp = Vi[i] * + ;
} else {
tmp = Vi[i] * ;
}
} else {
if (i == j) {
tmp = -Vi[i] * + ;
} else {
tmp = -Vi[i] * ;
}
}
addEdge(i, n+j, , -tmp);
}
} rep(i, , n+) {
addEdge(s, i, , );
addEdge(n+i, t, , );
} ans = -MCMF(s, t);
if (ans < ) {
puts("Oh, I lose my dear seaco!");
} else {
printf("%d %.03f%%\n", ans/, ans%*100.0/n);
}
} #ifndef ONLINE_JUDGE
printf("time = %d.\n", (int)clock());
#endif return ;
}
【HDOJ】3315 My Brute的更多相关文章
- 【HDOJ】4729 An Easy Problem for Elfness
其实是求树上的路径间的数据第K大的题目.果断主席树 + LCA.初始流量是这条路径上的最小值.若a<=b,显然直接为s->t建立pipe可以使流量最优:否则,对[0, 10**4]二分得到 ...
- 【HDOJ】【3506】Monkey Party
DP/四边形不等式 裸题环形石子合并…… 拆环为链即可 //HDOJ 3506 #include<cmath> #include<vector> #include<cst ...
- 【HDOJ】【3516】Tree Construction
DP/四边形不等式 这题跟石子合并有点像…… dp[i][j]为将第 i 个点开始的 j 个点合并的最小代价. 易知有 dp[i][j]=min{dp[i][j] , dp[i][k-i+1]+dp[ ...
- 【HDOJ】【3480】Division
DP/四边形不等式 要求将一个可重集S分成M个子集,求子集的极差的平方和最小是多少…… 首先我们先将这N个数排序,容易想到每个自己都对应着这个有序数组中的一段……而不会是互相穿插着= =因为交换一下明 ...
- 【HDOJ】【2829】Lawrence
DP/四边形不等式 做过POJ 1739 邮局那道题后就很容易写出动规方程: dp[i][j]=min{dp[i-1][k]+w[k+1][j]}(表示前 j 个点分成 i 块的最小代价) $w(l, ...
- 【HDOJ】【3415】Max Sum of Max-K-sub-sequence
DP/单调队列优化 呃……环形链求最大k子段和. 首先拆环为链求前缀和…… 然后单调队列吧<_<,裸题没啥好说的…… WA:为毛手写队列就会挂,必须用STL的deque?(写挂自己弱……s ...
- 【HDOJ】【3530】Subsequence
DP/单调队列优化 题解:http://www.cnblogs.com/yymore/archive/2011/06/22/2087553.html 引用: 首先我们要明确几件事情 1.假设我们现在知 ...
- 【HDOJ】【3068】最长回文
Manacher算法 Manacher模板题…… //HDOJ 3068 #include<cstdio> #include<cstring> #include<cstd ...
- 【HDOJ】【1512】Monkey King
数据结构/可并堆 啊……换换脑子就看了看数据结构……看了一下左偏树和斜堆,鉴于左偏树不像斜堆可能退化就写了个左偏树. 左偏树介绍:http://www.cnblogs.com/crazyac/arti ...
随机推荐
- json 转 javaBean
前言:经常在网络上看见一些关于json自动转换成javaBean的jar包,项目组里的人也在用,稍稍研究了下,都是用的反射来做的.我细细想了下里面的逻辑,我觉得直接生成JavaBean代码岂不是更加直 ...
- 学习笔记_过滤器应用_1(分ip统计网站的访问次数)
分ip统计网站的访问次数 ip count 192.168.1.111 2 192.168.1.112 59 统计工作需要在所有资源之前都执行,那么就可以放到Filter中了. 我们这个过滤器不打算做 ...
- postgres create table default now
key_time timestamp without time zone default timestamp 'now()' see http://wordpress.factj.com/
- 关于cnpm的一点小bug
在实际工作中,一个项目完成后,在上线前,常常需要把代码进行压缩,一般是用gulp或者 webpack 进行压缩.(小妹是用gulp) gulp是运行在node 环境下的. 所以首先,下载并安装了nod ...
- 10.21_Nutz批量插入顺序,POI,wiki持续关注,POI,SSH,数据库优先
(1)Nutz,dao的批量插入会关注顺序吗? http://www.douban.com/group/topic/64322582/ (2)工作需要优先!!! POI,SSH,数据库管理及plsq ...
- (poj) 1751 Highways
Description The island nation of Flatopia is perfectly flat. Unfortunately, Flatopia has a very poor ...
- C语言程序设计概述
1 概论 1972年Dennis Ritchie发明了C语言,而后Dennis Ritchie又使用C语言重写了Unix系统,自那以后C语言逐渐受到了全世界大多数编程爱好者的喜爱,后期的主流操作系统L ...
- ASP.NET中的验证控件
ASP.NET提供了如下的控件: RequiredFieldValidator: 字段必填 (ControlTovalidate设定要验证的控件) RangeValidator: 值在给定的最大值,最 ...
- 完整的 AJAX 写法(支持多浏览器)
代码如下: <script type="text/javascript"> var xmlhttp; function Submit() { //1.创建 XMLHtt ...
- linux - 创建用户
apt-get update apt-get upgrade root@iZ28t2p7lz9Z:~# adduser cuiAdding user `cui' ...Adding new group ...