TLE70 求助
查看原帖
TLE70 求助
362750
TernaryTree楼主2023/12/12 22:33
#include <bits/stdc++.h>
#define int long long
#define double signed

using namespace std;

typedef double db;
const int maxn = 1e4 + 5;
const int maxm = 1e3 + 5;
const db eps = 1e-6;
const db inf = 1e18;

struct Simplex {
	int n, m;
	db a[maxn];
	db f[maxm][maxn];
	Simplex() = default;
	
	void init(int nn, int mm) {
		n = nn;
		m = mm;
	}
	
	void output() {
		for (int i = 0; i <= n; i++) cout << a[i] << " ";
		cout << endl;
		for (int i = 1; i <= m; i++) {
			for (int j = 0; j <= n; j++) cout << f[i][j] << " ";
			cout << endl;
		} 
	}
	
	void pivot(int r, int c) {
		// 将第 r 个基变量换进,把第 c 个非基变量换出
		db k = f[r][c];
		for (int i = 0; i <= n; i++) f[r][i] /= k;
		k = a[c];
		a[c] = 0;
		for (int z = 0; z <= n; z++) a[z] -= f[r][z] * k;
		for (int j = 1; j <= m; j++) {
			if (j == r || fabs(f[j][c]) < eps) continue;
			db k = f[j][c];
			f[j][c] = 0;
			for (int z = 0; z <= n; z++) f[j][z] -= f[r][z] * k;
		}
	}
	
	bool simplex() {
		while (true) {
			int r, c, mn = inf;
			r = c = -1;
			for (int i = 1; i <= n; i++) {
				if (a[i] > eps) c = i, i = n + 1;
			}
			if (c == -1) return 1;
			for (int j = 1; j <= m; j++) {
				if (f[j][c] > eps && f[j][0] / f[j][c] < mn) {
					mn = f[j][0] / f[j][c];
					r = j;
				}
			} 
			if (r == -1) return 0;
			pivot(r, c);
		}
	}
};

int n, m;
Simplex S;

signed main() {
	cin >> n >> m;
	S.init(m, n);
	for (int i = 1; i <= n; i++) cin >> S.f[i][0];
	for (int i = 1; i <= m; i++) {
		int l, r;
		cin >> l >> r >> S.a[i];
		for (int j = l; j <= r; j++) S.f[j][i] = 1;
	}
	S.simplex();
	cout << -S.a[0] << endl;
	return 0;
}

2023/12/12 22:33
加载中...