4868: [Shoi2017]期末考試
Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 842 Solved: 385
[Submit][Status][Discuss]
Description
有n位同窗,每位同窗都參加了所有的m門課程的期末考試,都在焦急的等待成績的公佈。第i位同窗但願在第ti天或以前得知所.有.課程的成績。若是在第ti天,有至少一門課程的成績沒有公佈,他就會等待最後公佈成績的課程公佈成績,每等待一天就會產生C不愉快度。對於第i門課程,按照本來的計劃,會在第bi天公佈成績。有以下兩種操做能夠調整公佈成績的時間:1.將負責課程X的部分老師調整到課程Y,調整以後公佈課程X成績的時間推遲一天,公佈課程Y成績的時間提早一天;每次操做產生A不愉快度。2.增長一部分老師負責學科Z,這將致使學科Z的出成績時間提早一天;每次操做產生B不愉快度。上面兩種操做中的參數X,Y,Z都可任意指定,每種操做都可以執行屢次,每次執行時均可以從新指定參數。如今但願你經過合理的操做,使得最後總的不愉快度之和最小,輸出最小的不愉快度之和便可
Input
第一行三個非負整數A,B,C,描述三種不愉快度,詳見【問題描述】;
第二行兩個正整數n,m(1≤n,m≤105),分別表示學生的數量和課程的數量;
第三行n個正整數ti,表示每一個學生但願的公佈成績的時間;
第四行m個正整數bi,表示按照本來的計劃,每門課程公佈成績的時間。
1<=N,M,Ti,Bi<=100000,0<=A,B,C<=100000
Output
輸出一行一個整數,表示最小的不愉快度之和。
Sample Input
100 100 2
4 5
5 1 2 3
1 1 2 3 3
4 5
5 1 2 3
1 1 2 3 3
Sample Output
6
因爲調整操做產生的不愉快度太大,因此在本例中最好的方案是不進行調整; 所有
5 的門課程中,最慢的在第 3 天出成績;
同窗 1 但願在第 5 天或以前出成績,因此不會產生不愉快度;
同窗 2 但願在第 1 天或以前出成績,產生的不愉快度爲 (3 - 1) * 2 = 4;
同窗 3 但願在第 2 天或以前出成績,產生的不愉快度爲 (3 - 2) * 2 = 2;
同窗 4 但願在第 3 天或以前出成績,因此不會產生不愉快度;
不愉快度之和爲 4 + 2 = 6 。
因爲調整操做產生的不愉快度太大,因此在本例中最好的方案是不進行調整; 所有
5 的門課程中,最慢的在第 3 天出成績;
同窗 1 但願在第 5 天或以前出成績,因此不會產生不愉快度;
同窗 2 但願在第 1 天或以前出成績,產生的不愉快度爲 (3 - 1) * 2 = 4;
同窗 3 但願在第 2 天或以前出成績,產生的不愉快度爲 (3 - 2) * 2 = 2;
同窗 4 但願在第 3 天或以前出成績,因此不會產生不愉快度;
不愉快度之和爲 4 + 2 = 6 。
HINT
存在幾組數據,使得C = 10 ^ 16php
Source
黑吉遼滬冀晉六省聯考c++
聽說能夠三分作?spa
但爲什麼 O(N)的貪心就能A 還寫三分?code
咱們從小到大枚舉一下最後一門課的完成時間,枚舉過程就能處理出學生和老師的一些信息。blog
而後根據這些信息就能貪心了2333.ip
#include<bits/stdc++.h> #define ll long long #define maxn 100005 using namespace std; ll ans=1ll<<62ll,A,B,C,alr=0; int n,m,t[maxn],student; int now,b[maxn],teacher; ll lef,overflow; int main(){ scanf("%lld%lld%lld",&A,&B,&C); scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) scanf("%d",&now),t[now]++; for(int i=1;i<=m;i++) scanf("%d",&now),b[now]++,overflow+=(ll)now; for(int T=1;T<=100000;T++){ //for student alr+=student*C; if(alr>=ans) break; student+=t[T]; //for teacher lef+=(ll)teacher,overflow-=(ll)(m-teacher); teacher+=b[T]; ll tot=0; if(B<=A) tot=overflow*B; else if(overflow<=lef) tot=overflow*A; else tot=lef*A+(overflow-lef)*B; ans=min(ans,tot+alr); } printf("%lld\n",ans); return 0; }