zoukankan      html  css  js  c++  java
  • bzoj4868 [Shoi2017]期末考试

    4868: [Shoi2017]期末考试

    Time Limit: 20 Sec  Memory Limit: 512 MB
    Submit: 961  Solved: 437
    [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≤10^5),分别表示学生的数量和课程的数量;
    第三行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 ^ 16

    Source

    黑吉辽沪冀晋六省联考

    分析:挺简单的一道题.

       最后的答案只与最晚公布的成绩的时间有关. 那么二分?三分?其实都不必要,直接枚举就好了. 然后贪心算费用. 如果A < B,那么尽量使用1操作,否则就只进行2操作.  为什么是尽量呢?因为进行1操作必然要把一个时间比当前枚举的x小的给+1,把比x大的一个-1. 如果比x小的全部被加到了x,还有比x大的,就只能用2操作了.

       如何快速实现贪心过程呢?维护2个前缀和1个后缀和即可.

       注意特判c = 10^16的数据,会爆long long.

    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    #include <cmath>
    
    using namespace std;
    
    typedef long long ll;
    
    const ll maxn = 100010,inf = 9223372036854775800;
    ll A,B,C,sum1[maxn],sum2[maxn],sum3[maxn],num1[maxn],num2[maxn],n,m;
    ll t[maxn],b[maxn],cnt1,cnt2,cnt3,ans = inf;
    
    void solve2()
    {
        for (ll i = 1; i <= 100000; i++)
        {
            ll temp = 0;
            if (A < B)
            {
                if (sum1[i] <= sum2[i])
                {
                    ll t = sum2[i] - sum1[i];
                    temp = sum1[i] * A;
                    temp += t * B;
                }
                else
                    temp = sum2[i] * A;
            }
            else
                temp = sum2[i] * B;
            temp += sum3[i];
            if (temp < ans)
                ans = temp;
        }
    }
    
    void solve1()
    {
        sort(t + 1,t + 1 + n);
        for (ll i = 1; i <= t[1]; i++)
        {
            ll temp = 0;
            if (A < B)
            {
                if (sum1[i] <= sum2[i])
                {
                    ll t = sum2[i] - sum1[i];
                    temp = sum1[i] * A;
                    temp += t * B;
                }
                else
                    temp = sum2[i] * A;
            }
            else
                temp = sum2[i] * B;
            if (temp < ans)
                ans = temp;
        }
    }
    
    int main()
    {
        scanf("%lld%lld%lld",&A,&B,&C);
        scanf("%lld%lld",&n,&m);
        for (ll i = 1; i <= n; i++)
        {
            scanf("%lld",&t[i]);
            num1[t[i]]++;
        }
        for (ll i = 1; i <= m; i++)
        {
            scanf("%lld",&b[i]);
            num2[b[i]]++;
        }
        for (ll i = 1; i <= 100000; i++)
        {
            sum1[i] = sum1[i - 1] + cnt1;
            sum3[i] = sum3[i - 1] + cnt3 * C;
            cnt1 += num2[i];
            cnt3 += num1[i];
        }
        for (ll i = 100000; i >= 1; i--)
        {
            sum2[i] = sum2[i + 1] + cnt2;
            cnt2 += num2[i];
        }
        if (C == 10000000000000000)
            solve1();
        else
            solve2();
        printf("%lld
    ",ans);
    
        return 0;
    }
  • 相关阅读:
    钱多多软件制作04
    团队项目01应用场景
    HDU 4411 arrest
    HDU 4406 GPA
    HDU 3315 My Brute
    HDU 3667 Transportation
    HDU 2676 Matrix
    欧拉回路三水题 POJ 1041 POJ 2230 POJ 1386
    SPOJ 371 BOXES
    POJ 3422 Kaka's Matrix Travels
  • 原文地址:https://www.cnblogs.com/zbtrs/p/8644288.html
Copyright © 2011-2022 走看看