SHOI2017 期末考試

2022-05-03 18:48:06 字數 1636 閱讀 8562

有n位同學,每位同學都參加了全部的m門課程的期末考試,都在焦急的等待成績的公布。

第i位同學希望在第ti天或之前得知所有課程的成績。如果在第ti天,有至少一門課程的成績沒有公布,他就會等待最後公布成績的課程公布成績,每等待一天就會產生c不愉快度。對於第i門課程,按照原本的計畫,會在第bi天公布成績。

1、將負責課程x的部分老師調整到課程y,調整之後公布課程x成績的時間推遲一天,公布課程y成績的時間提前一天;每次操作產生a不愉快度。

2、增加一部分老師負責學科z,這將導致學科z的出成績時間提前一天;每次操作產生b不愉快度。

上面兩種操作中的引數x;y;z均可任意指定,每種操作均可以執行多次,每次執行時都可以重新指定引數。

現在希望你通過合理的操作,使得最後總的不愉快度之和最小,輸出最小的不愉快度之和即可。

第一行三個非負整數 a; b; c ,描述三種不愉快度,詳見【問題描述】;

第二行兩個正整數 n; m(1 ≤ n; m ≤ 10^5) ,分別表示學生的數量和課程的數量;

第三行 n 個正整數 ti ,表示每個學生希望的公布成績的時間;

第四行 m 個正整數 bi ,表示按照原本的計畫,每門課程公布成績的時間。

輸出一行乙個整數,表示最小的不愉快度之和。

這道題好多其他人都寫的三分,我自己在做的時候還是想的是列舉加字首和亂搞...

首先我們只關心最後乙個成績公布的時間,所以我們可以先對人和成績排序,再求字首和。

這樣有什麼好處呢,當我們想要求當最後乙個成績公布的時間為k時調整老師的代價時,我們可以先二分劃分出公布時間在時限範圍內的和不在時限範圍內的科目,然後利用字首和算出需要節約出多少個單位的時間,然後有乙個策略顯然:

對於已經在時限內的科目,他們的公布時間具體是多少沒有意義,但是當1操作的代價低於2操作的代價時,我們可以盡量讓這些科目的老師去支援那些後面的老師。

設最後乙個成績是ti,恰好前pos個課程結束的時間在時限範圍之內,我們最多可以進行(pos*ti-pre_class[pos])次1操作。

所以對於那些超出時限的科目,他們超出的那些時間單位的前(pos*ti-pre_class[pos])的部分可以通過1、2兩種操作中代價最小的進行處理,剩下的部分只能通過2操作進行處理。

通過同樣的方法,我們可以算出所有人要等的時間之和。

由於每乙個人要求的時間和成績公布的時間都不超過1e5,所以就可以列舉時間(或者三分),並在o(logn)時間內算出答案,求最小值即可。

#include#include

#include

#include

#include

#define ll long long

#define m 200040

#define inf (1e15)

using

namespace

std;

ll read()

ll n,m,a,b,c,p[m],t[m],c[m],pre[m],cst,ps;

ll res,maxn,st[m],num,pos,sum,ans;

ll find(ll ti)

return

tk;}

ll findt(ll ti)

return

tk;}

ll gt_ans(ll ti)

intmain()

bzoj 4868 Shoi2017 期末考試

題意 略 一開始xjb貪心了好長時間.然後發現可以從後往前列舉最晚時間,o 1 得到最小代價 確定最晚時間後就可以知道哪些可以用a啦!一定要考慮這種變化變成不變的思想!include include include include using namespace std typedef long l...

LOJ 2141 SHOI2017 期末考試

loj 2141 據說這道題可以三分 甚至二分 反正我是列舉的 先將t和b陣列排序後計算出字首和,然後列舉最晚的出成績時間,每次可以o 1 直接計算調整到該時間所需的代價。如何計算?對於學生不滿意造成的代價,是 不滿意人數 最晚結束時間 所有不滿的人的t之和 對於調整老師造成的代價,a b 時先用a...

BZOJ4868 Shoi2017 期末考試

time limit 20 sec memory limit 512 mb submit 936 solved 426 submit status discuss 有n位同學,每位同學都參加了全部的m門課程的期末考試,都在焦急的等待成績的公布。第i位同學希望在第ti天 或之前得知所.有.課程的成績。...