[六省聯考2017]期末考試 貪心 枚舉

題面

題面

題解

因爲每個學生產生的代價其實只跟自身屬性和最後一門成績的公佈時間相關,
所以考慮如果我們固定一個時間t作爲最後一場,那麼我們就可以快速算出此時的代價了。
首先在t之前的成績都可以用來和在t後面的成績多次配對進行第一種操作。
因此我們先貪心的進行第一種操作,能搞幾次就搞幾次,如果剩下還有在t後面的成績,即再用第二種操作強行提前(如果第二種操作的代價比第一種操作低,那就將第一種操作的代價設爲第二種操作的代價就可以保證結果正確性了)
而要算出這樣決策的代價,我們只需要知道在t前面的成績可以供給幾次操作1,在t後面的操作需要提前幾次即可。
這2個東西都可以直接算,前者就是把當前時間 - 在t前面的成績公佈時間做一次求和,所以我們只需要對2部分分別求和(過程中前綴和優化),即可做到全局線性的複雜度(線性來自於2次前綴和)
後者也可以用一樣的方法求。
然後就是直接算了。
複雜度就是\(O(t + n)\),,,,非常優秀

#include<bits/stdc++.h>
using namespace std;
#define R register int
#define LL long long//大概是中間過程會爆?因爲如果爆成了負數,雖然不應該成爲答案,但是取min就會取這個負數了
#define us unsigned
#define AC 101000
#define inf 1000000000000000000LL

int n, m, l, r;//tot表示總的公佈時間,sum表示無需減小的公佈時間,all表示需要等待的學生的sum(s[i])
us LL s[AC], t[AC], A, B, C, ans = inf, tot, all, sum;

inline int read()
{
    int x = 0;char c = getchar();
    while(c > '9' || c < '0') c = getchar();
    while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
    return x;
}

inline void upmin(us LL &a, us LL b) {if(b < a) a = b;}

void pre()
{
    A = read(), B = read(), C = read();
    n = read(), m = read();
    for(R i = 1; i <= n; i ++) s[i] = read();
    for(R i = 1; i <= m; i ++) t[i] = read(), tot += t[i];
    sort(s + 1, s + n + 1), sort(t + 1, t + m + 1);
}

void work()
{
    int l = 0, r = 0;
    if(B < A) A = B;//如果直接提前比交換代價還要小的話,不如全都直接提前
    for(us LL i = 1; i <= t[m]; i ++)
    {
        while(l < n && s[l + 1] <= i) ++ l, all += s[l];
        while(r < m && t[r + 1] <= i) ++ r, sum += t[r];
        LL rnt = C * (l * i - all);//獲取學生等待帶來的貢獻
        LL rest = i * r - sum;//獲取前面的公佈時間最多分幾天向後拖延
        LL have = tot - sum - i * (m - r);//獲取後面還需要提前幾天
        if(have)
        {
            if(rest >= have) rnt += have * A;//如果rest足夠就直接全部交換(如果提前代價比較小就會直接提前)
            else rnt += rest * A + (have - rest) * B;//否則就能交換就交換,不能交換就提前
        }   
        upmin(ans, rnt);
    }
    printf("%lld\n", ans);
}

int main()
{
//  freopen("in.in", "r", stdin);
    pre();
    work();
//  fclose(stdin);
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章