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\n", 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;
}

原文地址:https://www.cnblogs.com/sbfhy/p/8660867.html

时间: 2024-11-08 23:55:03

Codeforces 614D 二分的相关文章

CodeForces 801C 二分,浮点数

CodeForces 801C 题意: n个设备,第 i个设备每秒用电a[i],原本储存电量b[i].只有一个充电器,每秒可给一个设备充电 p.所有的设备要同时工作,问最多可以工作多长时间? tags:就是二分,但写挂了好多发.. 坑点: 1.右边界会爆1e9 ... 2.担心 double 会丢失精度,用了 long double. 然后long double ,头文件 #include <iomanip.h> .一开始用 printf("%.6Lf\n", r)输出,在

codeforces 671B (二分) - xgtao -

题目链接 有n(<=500000)个人有各自的财富,Robin Hood要劫富济贫,每次把最富有的那个人的财富抢去1,加在最穷的那个人的财富里,但是一共只能抢有限次数,问最后最富有的那个人和最穷的那个人财富差的最小值. 要让最富有与最穷的差值最小,也就是要让一个最大值最小,最小值最大,用最大值最小-最小值最大那么就是最小,那么求这两个值就可以用二分. #include <iostream> #include <cstdio> #include <algorithm>

CodeForces 607A (二分)

/* ********************************************** CodeForces 607A Author:herongwei Created Time: 2016/5/31 13:00:00 File Name : main.cpp 一个线段上有n个灯塔,每个灯塔有两个属性 (位置和破坏距离) 现在一次性从右到左开启所有灯塔,每个灯塔开启后 只有该灯塔未被破坏时会破坏左边距离范围内所有灯塔, 问现在在最右边放置一个灯塔(位置和距离随意),所能破坏的最小灯塔

codeforces 359D 二分答案+RMQ

上学期刷过裸的RMQ模板题,不过那时候一直不理解>_< 其实RMQ很简单: 设f[i][j]表示从i开始的,长度为2^j的一段元素中的最小值or最大值 那么f[i][j]=min/max{d[i][j-1], d[i+2^j-1][j-1]} RMQ的ST算法: 1 void ST() //初始化 2 { 3 memset(RMQ,1,sizeof(RMQ)); 4 5 for(int i=1;i<=n;i++) 6 RMQ[i][0]=a[i]; 7 for(int j=1;(1<

Codeforces 825D 二分贪心

题意:给一个 s 串和 t 串, s 串中有若干问号,问如何填充问号使得 s 串中字母可以组成最多的 t 串.输出填充后的 s 串. 思路:想了下感觉直接怼有点麻烦,要分情况:先处理已经可以组成 t 串的部分,然后处理 s 串中可以利用的部分,如果还有问号剩余,再直接怼.但如果用二分写就很直观了,直接看最多能组成多少个 t 串. 居然踩了long long的坑感觉自己宛若一个zz.check函数中的计算要用long long防止溢出= =(明明大水题的说. #include<iostream>

Codeforces 460C 二分结果+线段树维护

发现最近碰到好多次二分结果的题目,上次多校也是,被我很机智的快速过了,这个思想确实非常不错.在正面求比较难处理的时候,二分结果再判断是否有效往往柳暗花明. 这个题目给定n个数字的序列,可以操作m次,每次要操作w个连续的数字,每次的操作将使得该段连续数字的数都+1,最后求整个序列最小值的最大值 求最小值最大,明显的二分结果的题目,我一开始还是在ACdream那个群里看到这个题,说是二分+线段树的题目,我就来做了一下..首先二分部分很容易,下界就是初始序列的最小值,上界就是 下界+m,至于怎么判断这

CodeForces 614D Skills

排序+枚举+二分 最大的那些变成A,小的那部分提高最小值 #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; const int maxn=100000+10; int n; long long A,cf,cm,m; struct X { long long a; long long ans; int id; } s[maxn]

[CodeForces - 614D] D - Skills

D - Skills 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

CodeForces 460C——二分+前缀和—— Present

Little beaver is a beginner programmer, so informatics is his favorite subject. Soon his informatics teacher is going to have a birthday and the beaver has decided to prepare a present for her. He planted n flowers in a row on his windowsill and star