题意

  给你n个数,可以花费1使得数字+1,最大加到A,最多花费m。最后,n个数里的最小值为min,为A的有k个,给你cm和cf,求force=min*cm+k*cf 的最大值,和n个数操作后的结果。

分析

  我们如果要让最小值增加,那它加到和第二小的一样时,就有两个最小值,接下来就要两个一起增加。。到后来就要好多个一起增加了。

  那么我们可以枚举加到A的有多少个,然后用二分的方法求剩下m元,可以使最小值最大为多少。

怎么二分呢?

l=0,r=A。mid=(l+r)/2。

  我们假设现在是最小值为mid,那算出有多少个比 mid 小的,然后可以得出花费,如果花费比m大,那说明mid太大了,于是 r=mid-1,然后继续查找。如果花费比m小,那就可能mid太小了,先保存起来,然后 l=mid+1 继续查找。

  在算有多少个比mid小时,也可以用二分。比如假如 mmid 个比 mid 小,然而 a[mmid]>mid , 那就 mmid 太大了....也可以用 lower_bound 函数。

  于是我们具体的做法是:用结构体存下值和序号,先按值从小到大排序,然后求前缀和,枚举有 i 个加到 A ,算出花费,m减去这个花费剩下的拿去提升最小值,二分确定最小值的最大值,然后更新答案。

代码

#include<bits/stdc++.h>
#define N 100005
#define ll long long
using namespace std; struct data
{
ll id,v;
} a[N]; bool cmp(data a,data b)
{
return a.v<b.v||a.v==b.v&&a.id<b.id;
} ll n,A,cf,cm,m;
ll L,ans[N],f,ansA,ansL;
ll s[N]; ll findL(ll m,ll R)//还剩多少m,右端点是什么
{
ll l=,r=A,ans=;//二分确定最小值的值 while(l<=r)
{ ll mid=(r+l)>>; //二分确定有多少个比这个值小,然后计算需要的花费
int p=lower_bound(a+,a++n,(data){,mid},cmp)-a-;
if(p>R)p=R;
if(p*mid-s[p]<=m)
{
ans=mid;
l=mid+;
}
else
r=mid-;
}
return ans;
}
int main()
{
scanf("%lld%lld%lld%lld%lld",&n,&A,&cf,&cm,&m);
for(int i=; i<=n; i++)
{
scanf("%lld",&a[i].v);
a[i].id=i;
} sort(a+,a+n+,cmp);//先排序再求前缀和
for(int i=; i<=n; i++)
s[i]=s[i-]+a[i].v; for(int i=; i<=n; i++) //如果有i个设置为A的话
{ ll p=A*i-s[n]+s[n-i];//花费
if(p<=m)
{
L=findL(m-p,n-i);//那最小值可以达到多少
if(cm*L+cf*i>f) //更新答案
{
f=cm*L+cf*i;
ansA=i;//储存有几个变成A
ansL=L;//储存最小值要达到多少
}
}
}
printf("%lld\n",f);
for(int j=; j<=n; j++)
{
if(j>n-ansA)
ans[a[j].id]=A;
else if(a[j].v<=ansL)
ans[a[j].id]=ansL;
else
ans[a[j].id]=a[j].v;
}
for(int i=; i<=n; i++)
printf("%lld ",ans[i]);
return ;
}

【CodeForces 613B】Skills的更多相关文章

  1. 【codeforces 415D】Mashmokh and ACM(普通dp)

    [codeforces 415D]Mashmokh and ACM 题意:美丽数列定义:对于数列中的每一个i都满足:arr[i+1]%arr[i]==0 输入n,k(1<=n,k<=200 ...

  2. 【codeforces 707E】Garlands

    [题目链接]:http://codeforces.com/contest/707/problem/E [题意] 给你一个n*m的方阵; 里面有k个联通块; 这k个联通块,每个连通块里面都是灯; 给你q ...

  3. 【codeforces 707C】Pythagorean Triples

    [题目链接]:http://codeforces.com/contest/707/problem/C [题意] 给你一个数字n; 问你这个数字是不是某个三角形的一条边; 如果是让你输出另外两条边的大小 ...

  4. 【codeforces 709D】Recover the String

    [题目链接]:http://codeforces.com/problemset/problem/709/D [题意] 给你一个序列; 给出01子列和10子列和00子列以及11子列的个数; 然后让你输出 ...

  5. 【codeforces 709B】Checkpoints

    [题目链接]:http://codeforces.com/contest/709/problem/B [题意] 让你从起点开始走过n-1个点(至少n-1个) 问你最少走多远; [题解] 肯定不多走啊; ...

  6. 【codeforces 709C】Letters Cyclic Shift

    [题目链接]:http://codeforces.com/contest/709/problem/C [题意] 让你改变一个字符串的子集(连续的一段); ->这一段的每个字符的字母都变成之前的一 ...

  7. 【Codeforces 429D】 Tricky Function

    [题目链接] http://codeforces.com/problemset/problem/429/D [算法] 令Si = A1 + A2 + ... + Ai(A的前缀和) 则g(i,j) = ...

  8. 【Codeforces 670C】 Cinema

    [题目链接] http://codeforces.com/contest/670/problem/C [算法] 离散化 [代码] #include<bits/stdc++.h> using ...

  9. 【codeforces 515D】Drazil and Tiles

    [题目链接]:http://codeforces.com/contest/515/problem/D [题意] 给你一个n*m的格子; 然后让你用1*2的长方形去填格子的空缺; 如果有填满的方案且方案 ...

随机推荐

  1. codeforces 709A A. Juicer(水题)

    题目链接: A. Juicer 题意: 给出n个橘子,汁漫出来了就倒出来,反正就是要求要倒几次; 思路: AC代码: #include <iostream> #include <cs ...

  2. Adobe Scout 入门

    http://www.adobe.com/cn/devnet/scout/articles/adobe-scout-getting-started.html Adobe Scout 是新一代 Flas ...

  3. ofbiz的部署及安装问题解决办法

    ofbiz是apache下的顶级开源项目之一,非常强大说下正常流程及解决办法. 开发环境:本人开发环境是win7系统 准备: 1.如果使用的是git,从https://github.com/apach ...

  4. Linux命令学习-grep

    1.作用Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来.grep全称是Global Regular Expression Print,表示全局 ...

  5. java12 - 7 排序的案例

    对键盘录入的字符串中的字符进行排序. 举例:"dacgebf" 结果:"abcdefg" 分析:1.首先对字符转换为数组,并进行排序: A:直接让它们以字符的形 ...

  6. 013医疗项目-模块一:加入工具类ResultUtil

    这篇文章要做的就是优化,封装.把之前的代码尽量封装进类,并且不要硬编码. 在UserServiceimpl中的insertSysuser()函数之前是这么写的: ResultInfo resultIn ...

  7. .NET 常见的偏门问题

    1.空格 一般情况下," " 的空格可能被过滤掉,在中文输入法中也同样. 有的人会使用2次空格,但是还是无法达到目的. 实现方法:" "的空格,这不是使用2次空 ...

  8. sql 索引 填充因子(转)

    和索引重建最相关的是填充因子.当创建一个新索引,或重建一个存在的索引时,你可以指定一个填充因子,它是在索引创建时索引里的数据页被填充的数量.填充因子设置为100意味着每个索引页100%填满,50%意味 ...

  9. [转]SRTM、ASTER GDEM等全球数字高程数据(DEM)下载方式简介

    之前写过一篇短文对比过几种数字高程数据的区别:5种全球高程数据对比,这篇文章简要介绍下如何下载这些数据.       1.DLR的数字高程数据.该数据也是SRTM(shuttle radar topo ...

  10. slf4j,log4j,logback 初步使用

    log4j,slf4j,logback简单介绍见 LogBack简易教程 Logback浅析 简单的将,slf4j是一个日志的框架,有各种日志的接口,但是并不包含实际的写日志的方法. log4j,lo ...