题目大意:给你N个数,要求你找出k个数,使得xn/k的最大值。(xn代表的是k个数组成的逆序对的数量)
解题思路:将每个数当成一个点,如果两个数组成逆序对的关系,就连边,这样图就构成了
详解请看刘伯涛:最小割模型在信息学竞赛中的应用
这题的精度要求较高,要小心
这题还有一个技巧,就是二分确定S集,然后找出S级中的所有的边和点,然后除一下就可以了
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
#define N 1110
#define INF 0x3f3f3f3f
const double Max = 0x3fffffff;
const double esp = 1e-10;
struct Edge {
int from, to;
double cap, flow;
Edge() {}
Edge(int from, int to, double cap, double flow): from(from), to(to), cap(cap), flow(flow) {}
};
struct ISAP {
int p[N], num[N], cur[N], d[N];
int t, s, n, m;
bool vis[N];
vector<int> G[N];
vector<Edge> edges;
void init(int n) {
this->n = n;
for (int i = 0; i <= n; i++) {
G[i].clear();
d[i] = INF;
}
edges.clear();
}
void AddEdge(