一口气做完六个省的省选(误)

[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 }
D1T1

相关文章:

  • 2021-09-13
  • 2021-07-19
  • 2021-05-25
  • 2022-01-01
  • 2022-12-23
  • 2021-09-24
猜你喜欢
  • 2021-09-25
  • 2021-09-15
  • 2021-05-29
  • 2022-12-23
  • 2021-08-05
  • 2022-12-23
  • 2021-07-19
相关资源
相似解决方案