一口气做完六个省的省选(误)
[Shoi2017]期末考试
枚举最大的天数,然后代价贪心地O(1)计算。
1 #include <cstdio> 2 #include <algorithm> 3 4 #define R register 5 typedef long long ll; 6 #define maxn 100010 7 #define cmax(_a, _b) (_a < (_b) ? _a = (_b) : 0) 8 #define cmin(_a, _b) (_a > (_b) ? _a = (_b) : 0) 9 #define dmin(_a, _b) ((_a) < (_b) ? (_a) : (_b)) 10 int a[maxn], b[maxn]; 11 int main() 12 { 13 R ll A, B, C, sum = 0, suma = 0; scanf("%lld%lld%lld", &A, &B, &C); 14 R int n, m, maxx = 0; scanf("%d%d", &n, &m); 15 for (R int i = 1; i <= n; ++i) scanf("%d", &a[i]), suma += a[i]; 16 for (R int i = 1; i <= m; ++i) scanf("%d", &b[i]), sum += b[i]; 17 std::sort(a + 1, a + n + 1); 18 std::sort(b + 1, b + m + 1); 19 maxx = b[m]; 20 R int p = m + 1, pp = n + 1; 21 R ll pre = sum, suf = 0, ans = 1e18; 22 for (R int i = maxx; i; --i) 23 { 24 while (p && b[p - 1] >= i) --p, suf += b[p], pre -= b[p]; 25 while (pp && a[pp - 1] >= i) suma -= a[--pp]; 26 R ll need = suf - 1ll * i * (m - p + 1); 27 if (A >= B) 28 { 29 R ll cost = (1ll * i * (pp - 1) - suma) * C + need * B; 30 cost > 0 ? cmin(ans, cost) : 0; 31 } 32 else 33 { 34 R ll v = 1ll * i * (p - 1) - pre; 35 // printf("v = %lld %lld %d\n", v, need, i); 36 // printf("pp %d suma %lld\n", pp, suma); 37 cmin(v, need); 38 R ll cost = (1ll * i * (pp - 1) - suma) * C + v * A; 39 need -= v; 40 cost += need * B; 41 cost > 0 ? cmin(ans, cost) : 0; 42 // printf("%lld\n", ans); 43 } 44 } 45 printf("%lld\n", ans); 46 return 0; 47 }