• Codeforces 614D 二分


    D. Skills

    题意:
    给出 n, A, cf, cm, m,表示有 n 个技能,每个技能当前水平为 a[i] ,最高水平为 A ,有 m 个技能点,花费一个技能点可以使任意一个技能水平加一 (最高只能是 A)。
    如果最后水平为 A 的技能有 x 个,最低的技能水平值为 y,定义权值为 cf*x+cm*y 。求可能的最高权值,并输出最后每个技能的水平。
    tags:
    枚举 x ,对当前 x 二分可能的最低水平值,check 时还要再二分一下。

    // 614D
    #include<bits/stdc++.h>
    using namespace std;
    #pragma comment(linker, "/STACK:102400000,102400000")
    #define rep(i,a,b) for (int i=a; i<=b; ++i)
    #define per(i,b,a) for (int i=b; i>=a; --i)
    #define mes(a,b)  memset(a,b,sizeof(a))
    #define INF 0x3f3f3f3f
    #define MP make_pair
    #define PB push_back
    #define fi  first
    #define se  second
    typedef long long ll;
    const int N = 200005;
    
    int n;
    ll  A, cf, cm, m, sum[N], b[N];
    pair< ll, int >a[N];
    bool check(ll y, ll m2, ll x) {
        int pos = lower_bound(a+1, a+1+n, MP(y,0)) - a;
        --pos;
        if(pos+x > n) pos=n-x;
        return m2 >= (y*pos-sum[pos]);
    }
    int main()
    {
        scanf("%d%lld%lld%lld%lld", &n, &A, &cf, &cm, &m);
        rep(i,1,n) scanf("%lld", &a[i].fi), a[i].se=i;
        sort(a+1, a+1+n);
        rep(i,1,n) sum[i]=sum[i-1]+a[i].fi;
        ll  ans=0, ans1=0, ans2=a[1].fi;
        for(ll x=0; x<=n; ++x)
        {
            ll  tmp = m - (A*x-(sum[n]-sum[n-x]));
            if(tmp < 0) continue;
            ll  l=a[1].fi, r=A, mid, ret;
            while(l <= r) {
                mid  = l+(r-l)/2;
                if(check(mid, tmp, x)) ret=mid, l=mid+1;
                else   r=mid-1;
            }
            if(ans < cf*x+cm*ret) {
                ans = cf*x+cm*ret;
                ans1=x,  ans2=ret;
            }
        }
        printf("%lld
    ", ans);
        int pos = lower_bound(a+1, a+1+n, MP(ans2,0)) - a;
        --pos;
        if(pos+ans1 > n) pos = n-ans1;
        rep(i,1,pos) b[a[i].se] = ans2;
        rep(i,pos+1,n-ans1) b[a[i].se] = a[i].fi;
        rep(i,n-ans1+1,n) b[a[i].se] = A;
        rep(i,1,n) printf("%lld ", b[i]);
    
        return 0;
    }
    
  • 相关阅读:
    ibatis核心内容概述
    ibatis selectKey
    setTimeout ;setInterval
    <select>设置multiple="multiple"属性后 下拉框全部展开了 不再是折叠的怎么回事
    $.ajax()实例
    html页面不显示中文
    sublime卡顿
    error_reporting
    js笔记
    怎样查看MYSQL数据库的端口号
  • 原文地址:https://www.cnblogs.com/sbfhy/p/8660867.html
Copyright © 2020-2023  润新知