2017 [六省聯考] T1 期末考試

4868: [Shoi2017]期末考試

Time Limit: 20 Sec  Memory Limit: 512 MB
Submit: 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

Sample Output

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;
}
相關文章
相關標籤/搜索