• Codeforces Round #339 (Div. 1) B. Skills 暴力 二分


    B. Skills

    题目连接:

    http://www.codeforces.com/contest/613/problem/B

    Description

    Lesha plays the recently published new version of the legendary game hacknet. In this version character skill mechanism was introduced. Now, each player character has exactly n skills. Each skill is represented by a non-negative integer ai — the current skill level. All skills have the same maximum level A.

    Along with the skills, global ranking of all players was added. Players are ranked according to the so-called Force. The Force of a player is the sum of the following values:

    The number of skills that a character has perfected (i.e., such that ai = A), multiplied by coefficient cf.
    The minimum skill level among all skills (min ai), multiplied by coefficient cm.
    Now Lesha has m hacknetian currency units, which he is willing to spend. Each currency unit can increase the current level of any skill by 1 (if it's not equal to A yet). Help him spend his money in order to achieve the maximum possible value of the Force.

    Input

    The first line of the input contains five space-separated integers n, A, cf, cm and m (1 ≤ n ≤ 100 000, 1 ≤ A ≤ 109, 0 ≤ cf, cm ≤ 1000, 0 ≤ m ≤ 1015).

    The second line contains exactly n integers ai (0 ≤ ai ≤ A), separated by spaces, — the current levels of skills.

    Output

    On the first line print the maximum value of the Force that the character can achieve using no more than m currency units.

    On the second line print n integers a'i (ai ≤ a'i ≤ A), skill levels which one must achieve in order to reach the specified value of the Force, while using no more than m currency units. Numbers should be separated by spaces.

    Sample Input

    3 5 10 1 5
    1 3 1

    Sample Output

    12
    2 5 2

    Hint

    题意

    你有n个技能,每个技能最高A级,你还有m个技能点没加

    然后你的实力等于最低的技能等级*cm+等级加满的技能数量*cf

    现在问你怎么加点,可以使得你的实力最大

    题解:

    首先贪心,我加满的技能,肯定是从高往低加

    我要提高最低的技能,肯定从低到高加

    那么我就枚举我加满的技能数量,然后二分我究竟能够加多少个最低的技能。

    代码

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn = 1e5+7;
    int n;
    long long A,cf,cm,m;
    pair<long long ,int> a[maxn];
    long long b[maxn],c[maxn];
    bool cmp(pair<long long ,int> aa,pair<long long ,int> bb)
    {
        return aa.second<bb.second;
    }
    int main()
    {
        scanf("%d%lld%lld%lld%lld",&n,&A,&cf,&cm,&m);
        for(int i=1;i<=n;i++)
            scanf("%lld",&a[i].first),a[i].second=i;
        sort(a+1,a+1+n);
        for(int i=1;i<=n;i++)
        {
            b[i]=b[i-1]+a[i].first;
            c[i]=a[i].first*i-b[i];
        }
        long long ans = 0,ans1 = 0,ans2 = 0;
        for(int i=0;i<n;i++)
        {
            if(m<0)break;
            int pos = upper_bound(c,c+1+(n-i),m)-c-1;
            long long q = (m-c[pos])/pos+a[pos].first;
            q = min(q,A);
            long long tmp = q*cm+i*cf;
            if(tmp>ans)
            {
                ans = tmp;
                ans1 = q,ans2 = i;
            }
            m = m - (A - a[n-i].first);
        }
        if(m>=0)
            ans = A*cm+n*cf;
        printf("%lld
    ",ans);
        for(int i=1;i<=n;i++)
        {
            if(n-i<ans2)
                a[i].first = A;
            else if(a[i].first<=ans1)
                a[i].first = ans1;
        }
        sort(a+1,a+1+n,cmp);
        for(int i=1;i<=n;i++)
            printf("%lld ",a[i].first);
    }
  • 相关阅读:
    共创力董事长杨学明先生受邀参加CED智慧大会!
    杨学明老师为华宇金信(北京)软件有限公司提供为期两天的内训服务!
    《互联网敏捷测试管理实践》课程大纲 2018.12.15~16 (上海)
    共创力咨询杨学明老师为国电南瑞提供两天的内训服务!
    《软件测试管理》深圳公开课预告 2018.11.23~24 中南海滨大酒店
    软件测试管理的十大挑战
    对于开发人员修改代码引发新问题的处理措施
    热烈庆祝杨学明老师为上海某著名金融互联网公司提供两天的内训服务!
    《高效的互联网研发项目管理》课程大纲
    《软件测试管理》北京公开课预告 2018.9.28~29
  • 原文地址:https://www.cnblogs.com/qscqesze/p/5217367.html
Copyright © 2020-2023  润新知