写一个容易理解的B题吧:
首先,我们假设从A地向C地运输x吨货物,那么A向D运输A-x吨,B向C运输C-x吨,B向D运输B-(C-x)吨。记A->C的花费为ac,B->C的花费为bc,A->D的花费为ad,B->D的花费为bd。由此我们可以得到关于cost的一次函数:
y = (ac-ad+bd-bc)*x + bc*C+ad*A+bd*B-bd*C
可以看出y只和x的取值有关,我们可以分类讨论一下x的系数:
当(ac-ad+bd-bc) >= 0时,我们希望x越小越好,即A向C运输的量越小越好,那么B向C运输的量越大越好。
如果B>=C,那么我们直接将B全部运给C直至C满足要求,此时A向C运输0吨;如果B<C那么我们需要从A补充C-B吨:
即 x = 0 (B >= C), x = C - B (B < C)
当(ac-ad+bd-bc) < 0时,我们希望x越大越好,即A向C运输的量越大越好。
如果A>=C,那么我们直接将A全部运给C直至C满足要求,此时A向C运输C吨;如果A<C那么我们将可用的A全部运给C:
即 x = C (A >= C), x = A (A < C)
code如下:
/* 你将不再是道具,而是成为人如其名的人 --《Violet Evergarden》 */
#include <bits/stdc++.h>
#pragma GCC optimize(2, "Ofast", "inline")
#define IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define maxn (signed)(5e6 + 10)
#define int long long
#define double long double
#define all(x) (x).begin(), (x).end()
#define pb push_back
#define ri register
#define il inline
#define fi first
#define se second
#define pii pair<int, int>
#define sg signed
#define endl '\n'
#define spc ' '
#define M 998244353
#define inf 0x3f3f3f3f
#define lnf 0x3f3f3f3f3f3f3f3f
#define ninf -0x3f3f3f3f
#define readin(i, n, v) for(int o = (i); o < (n) + (i); o ++ ) cin >> (v)[o];
#define wtline(i, n, v) for(int o = (i); o < (n) + (i); o ++ ) cout << (v)[o] << " \n"[o == (n) + (i) - 1];
#define yon(x) cout << ((x) ? "Yes" : "No") << endl;
#define int128 __int128
#define gcd __gcd
int fpow(int a, int b) { int t = 1; for (; b; ) { if (b & 1) t *= a; b >>= 1; a *= a; } return t; }
int fpowm(int a, int b) { int t = 1; for (; b; ) { if (b & 1) t = t * a % M; b >>= 1; a = a * a % M; } return t; }
using namespace std;
/*
A->C X
ac*(x) + bc(C - x) + ad(A - x) + bd(B - C + x)
ac*x-bc*x-ad*x+bd*x+bc*C+ad*A+bd*B-bd*C
(ac-ad+bd-bc)*x +bc*C+ad*A+bd*B-bd*C
C接受A x, 接受 B C-x
d A-x B-C+X
*/
void solve() {
int A, B, C, D;
cin >> A >> B >> C >> D;
int ac, ad, bc, bd;
cin >> ac >> ad >> bc >> bd;
if((ac-ad+bd-bc) >= 0) {
if(B>=C) {
cout << (ac-ad+bd-bc)*0+bc*C+ad*A+bd*B-bd*C << endl;
}else {
cout << (ac-ad+bd-bc)*(C-B)+bc*C+ad*A+bd*B-bd*C << endl;
}
}else {
if(A >= C) {
cout << (ac-ad+bd-bc)*C+bc*C+ad*A+bd*B-bd*C << endl;
}else {
cout << (ac-ad+bd-bc)*A+bc*C+ad*A+bd*B-bd*C << endl;
}
}
}
sg main() {
IO;
int _ = 1;
cin >> _;
while (_--) {
solve();
}
return 0;
}

京公网安备 11010502036488号