P3745 [六省联考2017]期末考试

题目描述

有 \(n\) 位同学,每位同学都参加了全部的 \(m\) 门课程的期末考试,都在焦急的等待成绩的公布。

第 \(i\) 位同学希望在第 \(t_i\)​ 天或之前得知所有课程的成绩。如果在第 \(t_i\) 天,有至少一门课程的成绩没有公布,他就会等待最后公布成绩的课程公布成绩,每等待一天就会产生 \(C\) 不愉快度。

对于第 \(i\) 门课程,按照原本的计划,会在第 \(b_i\)​ 天公布成绩。

有如下两种操作可以调整公布成绩的时间:

  1. 将负责课程 \(X\) 的部分老师调整到课程 \(Y\),调整之后公布课程 \(X\) 成绩的时间推迟一天,公布课程 \(Y\) 成绩的时间提前一天;每次操作产生 \(A\) 不愉快度。
  2. 增加一部分老师负责学科 \(Z\),这将导致学科 \(Z\) 的出成绩时间提前一天;每次操作产生 \(B\) 不愉快度。

上面两种操作中的参数 \(X, Y, Z\) 均可任意指定,每种操作均可以执行多次,每次执行时都可以重新指定参数。

现在希望你通过合理的操作,使得最后总的不愉快度之和最小,输出最小的不愉快度之和即可。

输入输出格式

输入格式:

第一行三个非负整数 \(A, B, C\),描述三种不愉快度,详见【题目描述】;

第二行两个正整数 \(n, m\),分别表示学生的数量和课程的数量;

第三行 \(n\) 个正整数 \(t_i\),表示每个学生希望的公布成绩的时间;

第四行 \(m\) 个正整数 \(b_i\),表示按照原本的计划,每门课程公布成绩的时间。

输出格式:

输出一行一个整数,表示最小的不愉快度之和。

输入输出样例

输入样例#1: 复制

100 100 2

4 5

5 1 2 3

1 1 2 3 3

输出样例#1: 复制

6

输入样例#2: 复制

3 5 4

5 6

1 1 4 7 8

2 3 3 1 8 2

输出样例#2: 复制

33

说明

【样例 1 说明】

由于调整操作产生的不愉快度太大,所以在本例中最好的方案是不进行调整; 全部

5 的门课程中,最慢的在第 3 天出成绩;

同学 1 希望在第 5 天或之前出成绩,所以不会产生不愉快度;

同学 2 希望在第 1 天或之前出成绩,产生的不愉快度为 (3 − 1) ∗ 2 = 4;

同学 3 希望在第 2 天或之前出成绩,产生的不愉快度为 (3 − 2) ∗ 2 = 2;

同学 4 希望在第 3 天或之前出成绩,所以不会产生不愉快度;

不愉快度之和为 4 + 2 = 6 。

题解

整个题目的贪心在于如何处理\(A<B\),因为,\(A\)的使用会伴随着一门科目的推迟,也就是说\(A\)的使用次数是有限的。

注意到整个题目的意思就是要我们提前天数,那么我们可以考虑枚举天数,网上使用三分和二分的大佬们实在是太巨辣,我只会\(O(n)\)。

那么当\(A<B\)的时候,我们就根据天数的推移用前缀和统计一下能有几天可以推迟,然后计算\(A\)使用的次数,不够的再用\(B\)提前。

整个难点就在于学生和科目随时间的线性变化,要自己理一理。

我们用一个桶记录学生忍耐的时间,另一个记录科目出成绩的时间。

那么随时间线性变化便是,

每往后一天,记录这天前有多少科目是可以推迟的,对于推迟的贡献,

有多少学生是开始忍耐不了的。

有多少科目是还需要提前的,对于提前一共要多少天。

自己好好想一下。不懂可以看代码。

Code

#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
#define ll unsigned long long
using namespace std;
const ll MAXN=1e6+5;
ll a,b,c,n,m,N,M,sum,ans=1e18,tot;
ll ti[MAXN],bi[MAXN],bac1[MAXN],bac2[MAXN];
ll s,ss,tt,t1,t2,t3;
ll read(){
ll x=0,w=1;char ch=getchar();
while(ch>'9'||ch<'0'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
return x*w;
}
int main(){
a=read();b=read();c=read();
n=read();t2=m=read();
for(ll i=1;i<=n;i++)ti[i]=read(),bac1[ti[i]]++;
for(ll i=1;i<=m;i++)bi[i]=read(),bac2[bi[i]]++,ss+=bi[i];
for(ll i=1;i<=100000;i++){
//tt当前不能忍受的人的天数,ss当前需要提前的天数,s是当前可以做贡献的天数
tt+=bac1[i-1]+t1;t1+=bac1[i-1];
t2-=bac2[i];ss-=bac2[i]+t2;
s+=bac2[i-1]+t3;t3+=bac2[i-1];
sum=tt*c;tot=0;
if(a<b){
tot=min(ss,s);sum+=min(ss,s)*a;
}
sum=sum+max((ss-tot),(ll)0)*b;
ans=min(ans,sum);
}
cout<<ans<<endl;
return 0;
}

[luogu] P3745 [六省联考2017]期末考试 (贪心)的更多相关文章

  1. 洛谷 P3745 [六省联考2017]期末考试

    题目描述 有 nnn 位同学,每位同学都参加了全部的 mmm 门课程的期末考试,都在焦急的等待成绩的公布. 第 iii 位同学希望在第 tit_iti​ 天或之前得知所有课程的成绩.如果在第 tit_ ...

  2. 洛谷P3745 [六省联考2017]期末考试

    传送门 题解 //Achen #include<algorithm> #include<iostream> #include<cstring> #include&l ...

  3. 【BZOJ4868】[六省联考2017]期末考试(贪心)

    [BZOJ4868][六省联考2017]期末考试(贪心) 题面 BZOJ 洛谷 题解 显然最终的答案之和最后一个公布成绩的课程相关. 枚举最后一天的日期,那么维护一下前面有多少天可以向后移,后面总共需 ...

  4. [BZOJ4868][六省联考2017]期末考试(三分)

    4868: [Shoi2017]期末考试 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 964  Solved: 439[Submit][Status ...

  5. 题解 洛谷P3745 【[六省联考2017]期末考试】

    这题有点绕,我写了\(2h\)终于搞明白了. 主要思路:枚举最晚公布成绩的时间\(maxt\),然后将所有公布时间大于\(maxt\)的课程都严格降为\(maxt\)即可. 在此之前,还要搞清楚一个概 ...

  6. bzoj千题计划262:bzoj4868: [六省联考2017]期末考试

    http://www.lydsy.com/JudgeOnline/problem.php?id=4868 假设 最晚出成绩的是第i天 预处理 cnt[i] 表示 有多少个学生 期望出成绩的那一天 &l ...

  7. 2017 [六省联考] T1 期末考试

    4868: [Shoi2017]期末考试 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 842  Solved: 385[Submit][Status ...

  8. BZOJ 4872 luogu P3750 [六省联考2017]分手是祝愿

    4872: [Shoi2017]分手是祝愿 Time Limit: 20 Sec  Memory Limit: 512 MB[Submit][Status][Discuss] Description ...

  9. luogu P3750 [六省联考2017]分手是祝愿

    luogu loj 可以发现在最优策略中,每种操作最多只会做一次,并且操作的先后顺序并不会影响答案,所以考虑从后往前扫,碰到一个\(1\)就对这个位置\(i\)进行操作,这样的操作一定是最优策略.记最 ...

随机推荐

  1. Mybatis-Plus的BaseMapper的使用

    Mybatis-Plus 是一款 Mybatis 动态 SQL 自动注入 Mybatis 增删改查 CRUD 操作中间件, 减少你的开发周期优化动态维护 XML 实体字段. 下面简单举例,调用Base ...

  2. HDU 3849 By Recognizing These Guys, We Find Social Networks Useful

    By Recognizing These Guys, We Find Social Networks Useful Time Limit: 1000ms Memory Limit: 65536KB T ...

  3. C#中的string驻留池

    刚开始学习C#的时候,就听说CLR对于String类有一种特别的内存管理机制:有时候,明明声明了两个String类的对象,但是他们偏偏却指向同一个实例.如下: String s1 = "He ...

  4. [HTML5] How Visible vs. Hidden Elements Affect Keyboard/Screen Reader Users (ARIA)

    There are many techniques for hiding content in user interfaces, and not all are created equal! Lear ...

  5. 深刻理解Nginx之基本配置和升级(2)

    3 Nginx基本配置 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvam9obl9mX2xhdQ==/font/5a6L5L2T/fontsize/400 ...

  6. Hadoop自学笔记(二)HDFS简单介绍

    1. HDFS Architecture 一种Master-Slave结构.包括Name Node, Secondary Name Node,Data Node Job Tracker, Task T ...

  7. SGU 531 - Bonnie and Clyde 预处理+二分

    Bonnie and Clyde Description Bonnie and Clyde are into robbing banks. This time their target is a to ...

  8. 0x22 迭代加深

    poj2248 真是个新套路.还有套路剪枝...大到小和判重 #include<cstdio> #include<iostream> #include<cstring&g ...

  9. AngularJS 下拉列表demo

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <script sr ...

  10. Migrations有两个文件迁移数据的方法

    不分开迁移报错如下; 解决方案 1 迁移Migration/nfoManage EntityFramework\Enable-Migrations -ContextTypeName InfoModel ...