[六省联考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;
}

原文地址:https://www.cnblogs.com/ww3113306/p/10354365.html

时间: 2024-10-10 07:31:17

[六省联考2017]期末考试 贪心 枚举的相关文章

[luogu] P3745 [六省联考2017]期末考试 (贪心)

P3745 [六省联考2017]期末考试 题目描述 有 \(n\) 位同学,每位同学都参加了全部的 \(m\) 门课程的期末考试,都在焦急的等待成绩的公布. 第 \(i\) 位同学希望在第 \(t_i\)? 天或之前得知所有课程的成绩.如果在第 \(t_i\) 天,有至少一门课程的成绩没有公布,他就会等待最后公布成绩的课程公布成绩,每等待一天就会产生 \(C\) 不愉快度. 对于第 \(i\) 门课程,按照原本的计划,会在第 \(b_i\)? 天公布成绩. 有如下两种操作可以调整公布成绩的时间:

[六省联考2017]期末考试

4868: [Shoi2017]期末考试 2017-09-03 Description 有n位同学,每位同学都参加了全部的m门课程的期末考试,都在焦急的等待成绩的公布.第i位同学希望在第ti天或之前得知所.有.课程的成绩.如果在第ti天,有至少一门课程的成绩没有公布,他就会等待最后公布成绩的课程公布成绩,每等待一天就会产生C不愉快度.对于第i门课程,按照原本的计划,会在第bi天公布成绩.有如下两种操作可以调整公布成绩的时间:1.将负责课程X的部分老师调整到课程Y,调整之后公布课程X成绩的时间推迟

P3746 [六省联考2017]组合数问题

P3746 [六省联考2017]组合数问题 \(dp_{i,j}\)表示前\(i\)个物品,取的物品模\(k\)等于\(r\),则\(dp_{i,j}=dp_{i-1,(j-1+k)%k}+dp_{i-1,j}\) \(dp_{i,0},dp_{i,1},dp_{i,2}.....dp_{i,k-1}\) \(\Longrightarrow\) \(dp_{i+1,0},dp_{i+1,1},dp_{i+1,2}.....dp_{i+1,k-1}\) 仔细想想,你能构造出矩阵的 #include

bzoj千题计划265:bzoj4873: [六省联考2017]寿司餐厅

http://www.lydsy.com/JudgeOnline/problem.php?id=4873 选a必选b,a依赖于b 最大权闭合子图模型 构图: 1.源点 向 正美味度区间 连 流量为 美味度 的边 2.负美味度区间 向 汇点 连 流量为 美味度的绝对值 的边 3.区间[i,j] 向 区间[i+1,j].区间[i,j-1] 连 流量为 inf 的边 4.区间[i,i] 向 寿司i 连 流量为 inf 的边 5.寿司i 向 汇点 连 流量为 寿司代号 的边 6.寿司i 向 它的代号 连

bzoj千题计划266:bzoj4872: [六省联考2017]分手是祝愿

http://www.lydsy.com/JudgeOnline/problem.php?id=4872 一种最优解是 从大到小灯有亮的就灭掉 最优解是唯一的,且关灯的顺序没有影响 最优解 对每个开关至多操作1次,(连带着的灯的亮灭改变不算) 设最优解 需要操作cnt次,那么就有cnt盏灯是正确的选择 设 f[i] 表示 有i种正确的选择  变为 有i-1种正确的选择 的 期望次数 那么在n盏灯中,有i盏灯操作1次 就可以 减少一次正确选择 有n-i盏灯是错误的选择,选了它还要把它还原,还原它也

[BZOJ4869][六省联考2017]相逢是问候(线段树+扩展欧拉定理)

4869: [Shoi2017]相逢是问候 Time Limit: 40 Sec  Memory Limit: 512 MBSubmit: 1313  Solved: 471[Submit][Status][Discuss] Description Informatikverbindetdichundmich. 信息将你我连结.B君希望以维护一个长度为n的数组,这个数组的下标为从1到n的正整数.一共有m个操作,可以 分为两种:0 l r表示将第l个到第r个数(al,al+1,...,ar)中的每

六省联考2017

期末考试 sol 因为时间范围很小,所以可以利用单调性求出对于每一个时间$t$,当最晚的成绩公布时间为$t$时学生产生的不满意度总和$f_t$和让所有课程的公布时间不大于$t$的前提下课程产生的最小不满意度$g_t$.复杂度$O(nlogn)$,瓶颈是排序. 但是上面那个做法太不优雅了.我们可以发现$g_t$和$f_t$差分之后的数组都是单调不减,也就是$f_t+g_t$差分之后单调不减,也就意味着$f_t+g_t$这个数列是单谷数列.我们在时间范围上三分数列极小值即可. 然后因为三分太慢获得了

[六省联考2017]相逢是问候

相逢是问候 2017-09-09 Description Informatikverbindetdichundmich. 信息将你我连结.B君希望以维护一个长度为n的数组,这个数组的下标为从1到n的正整数.一共有m个操作,可以分为两种:0 l r表示将第l个到第r个数(al,al+1,...,ar)中的每一个数ai替换为c^ai,即c的ai次方,其中c是输入的一个常数,也就是执行赋值ai=c^ai1 l r求第l个到第r个数的和,也就是输出:sigma(ai),l<=i<=rai因为这个结果可

[六省联考2017]寿司餐厅

题链 这道题长着网络流的数据范围. 最大权闭合子图问题 跑最小割 #include<bits/stdc++.h> #define eho(x) for(int& i=hed[x];~i;i=net[i]) #define Eho(x) for(int i=head[x];~i;i=net[i]) #define N 52607 #define M 3500007 #define NN 1007 #define sight(c) (c<='9'&&c>='0'