[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 — 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.
Example
3 5 10 1 51 3 1
122 5 2
3 5 10 1 3391 3 1
355 5 5
Note
In the first test the optimal strategy is to increase the second skill to its maximum, and increase the two others by 1.
In the second test one should increase all skills to maximum.
题目的意思是,有几个技能,每个技能有一个初始等级,所有技能有一个共同的最大等级限度.现在你有几次升级的机会,要求升级之后,某个值最大化.
其中,这个值的计算方式是,满级的个数*常数1+等级最低值*常数2.
那么,我们可以枚举满级的个数,然后二分求解最小值,并且尽可能使其最大化.
假设我们现在枚举了有i个满级的,那么,要计算出剩下的钱还有多少,然后进行二分答案,枚举low,表示想让所有的等级都不小于low.
那么原来等级小于low的肯定要升级,花钱.如果钱够花就可以.
但是又有一个问题,在枚举+二分时,已经是nlogn的复杂度了,再套个n肯定TLE.而我们有需要知道,到底有几个等级小于low,以及总共少了多少.那么,对于这个问题,我们可以通过二分查找来实现.
所以,最后的复杂度是nlogn^2(注意,在更新答案的时候不要o(n)更新!!!可以取几个关键的值,最后再更新,还要注意数据类型).
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
;
int n,A,out[maxn];
struct data{
int x,i;
bool operator < (const data &u) const {return x<u.x;}
}cur[maxn];
long long cf,cm,m;
long long s[maxn],ans;
int f1,f2,f3;
inline long long read(){
; char ch=getchar();
') ch=getchar();
+ch-',ch=getchar();
return x;
}
int bis(int low){
,r=n,md;
;
if (low>cur[r].x) return r;
while (l<=r){
md=(l+r)>>;
].x<low&&low<=cur[md].x) ;
].x) r=md-; ;
}
}
bool jug(int low,long long money,int num){
int x=min(n-num,bis(low));
long long s1=s[x],s2=(long long)low*x;
if (s1+money>=s2){
;
ans=cf*num+cm*low; f1=low; f2=x; f3=num;
;
}
;
}
int main(){
n=(]=;
; i<=n; i++) cur[i].x=(].x=A;
sort(cur+,cur++n);
memset(,sizeof out);
ans=cm*cur[].x;
; i<=n; i++) if (cur[i].x==A) ans+=cf;
; i<=n; i++) out[cur[i].i]=cur[i].x;
; i<=n; i++) s[i]=s[i-]+cur[i].x;
;
; i<=n; i++){
].x) sum+=A-cur[n-i+].x;
if (sum>m) break;
].x,R=A,mid;
while (L<=R){
mid=(L+R)>>;
; ;
}
}
memset(,sizeof out);
; i<=f2; i++) out[cur[i].i]=f1;
; i<=n-f3; i++) out[cur[i].i]=cur[i].x;
; i<=n; i++) out[cur[i].i]=A;
printf("%lld\n",ans);
; i<=n; i++) printf("%d ",out[i]);
;
}
[CodeForces - 614D] D - Skills的更多相关文章
- CodeForces 614D Skills
排序+枚举+二分 最大的那些变成A,小的那部分提高最小值 #include<cstdio> #include<cstring> #include<cmath> #i ...
- Skills CodeForces - 614D (贪心)
链接 大意: $n$门课, 第$i$门分数$a_i$, 可以增加共$m$分, 求$cnt_{mx}*cf+mi*cm$的最大值 $cnt_{mx}$为满分的科目数, $mi$为最低分, $cf$, $ ...
- codeforces 581C. Developing Skills 解题报告
题目链接:http://codeforces.com/problemset/problem/581/C 题目意思:给出 n 个数:a1, a2, ..., an (0 ≤ ai ≤ 100).给出值 ...
- codeforces 613B B. Skills(枚举+二分+贪心)
题目链接: B. Skills time limit per test 2 seconds memory limit per test 256 megabytes input standard inp ...
- 【CodeForces 613B】Skills
题 题意 给你n个数,可以花费1使得数字+1,最大加到A,最多花费m.最后,n个数里的最小值为min,为A的有k个,给你cm和cf,求force=min*cm+k*cf 的最大值,和n个数操作后的结果 ...
- 「日常训练」Skills(Codeforce Round #339 Div.2 D)
题意(CodeForces 614D) 每个人有\(n(n\le 10^5)\)个技能,技能等级都在\([0,10^9]\)的范围,每个技能有一个当前等级,所有技能的最高等级都为A.一个人的力量被记做 ...
- Codeforces Round #322 (Div. 2) C. Developing Skills 优先队列
C. Developing Skills Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/581/p ...
- Codeforces Round #339 (Div. 1) B. Skills 暴力 二分
B. Skills 题目连接: http://www.codeforces.com/contest/613/problem/B Description Lesha plays the recently ...
- Skills CodeForces - 613B (双指针)
大意: $n$门课, 第$i$门分数$a_i$, 可以增加共$m$分, 求$cnt_{mx}*cf+mi*cm$的最大值 $cnt_{mx}$为满分的科目数, $mi$为最低分, $cf$, $cm$ ...
随机推荐
- 所有JTAG集成电路都应该支持菊花链
菊花链 在电气和电子工程中,菊花链是一种布线方案,其中多个设备按顺序或环形连接在一起.相邻设备才能通信.菊花链可用于电源,模拟信号,数字数据或其组合. 但是由于菊花链的串联特性,如果任何一个设备从链路 ...
- vue.js精讲02
2017-09-17 笔记及源码地址 : https://github.com/wll8/vue_note vue 中的事件深入. 事件: @click/mouseover…事件简写: @ 如 @cl ...
- HDU 3526 Computer Assembling(最小割)
http://acm.hdu.edu.cn/showproblem.php?pid=3526 题意:有个屌丝要配置电脑,现在有n个配件需要购买,有两家公司出售这n个配件,还有m个条件是如果配件x和配件 ...
- Linux命令之nl命令
nl 命令在 Linux 系统中用来计算文件中行号.nl 可以将输出的文件内容自动的加上行号,其默认的结果和 与 cat -n 有点不太一样,nl 可以将行号做比较多的显示设计,包括位数是否自动补齐 ...
- 2017"百度之星"程序设计大赛 - 初赛(A) 01,05,06
小C的倍数问题 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem ...
- hdu 6071 Lazy Running 最短路建模
Lazy Running Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Others) P ...
- C#端加载数据库,Combobox与Node控件绑定数据源demo示例
最近一直在做网页.用的js比较多,最近需要做一个C#相关的demo,一开始还有点不适应,写了几句有点感觉了 本篇博客的主要内容是C#怎么读取数据库文件里的数据以及相关控件如何绑定数据源,所做的Demo ...
- P1622 释放囚犯
传送门 区间DP简介: 在写这题前,需要先弄清楚区间DP是如何操作的: 区间DP的做法还是相对固定的,没有其他类型DP的复杂多变.主要思想就是先在小区间进行DP得到最优解,然后再利用小区间的最优解合并 ...
- C++.运行时类型判断_测试代码
ZC:C++ 编程思想——运行时类型识别 - 浅墨浓香 - 博客园.html(https://www.cnblogs.com/5iedu/articles/5585895.html) -------- ...
- 构造函数中用:base
如果person中有自己写的构造函数 则Student类的构造方法必须要加:base继承这个构造方法!因为默认的Student:base(空)构造方法已经被干掉了 构造方法的调用//base里的参数, ...