Codeforces Round #339 (Div. 1) B. Skills 暴力 二分
2016-02-25 16:07
405 查看
B. Skills
题目连接:
http://www.codeforces.com/contest/613/problem/BDescription
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 51 3 1
Sample Output
122 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\n",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); }
相关文章推荐
- Hibernate常见优化策略
- C 进制转换
- 如何判断两条直线相交
- DCMTK Work List 实验 II
- Red Hat 6.5 本地 yum源搭建
- Oracle分区表
- 第三方框架
- Unity3D 合并模型 个人理解
- 今日分享一点干货。PHP中课程表的实现。
- 7、继承
- DCMTK Work List 实验 I
- Java代码注释XXX TODO FIXME 的意义
- C/C++基础::sizeof() 与 sizeof(string)
- nova虚拟机的CPU配置-关于sockets,cores,threads的限制
- Python——内建异常体系结构
- [C++11]_[初级]_[shared_ptr的使用场景]
- CodeForces 626 A. Robot Sequence(水~)
- maven web项目的几种部署方式和常见的出错方式的解决
- [C++11]_[初级]_[shared_ptr的简单使用]
- 对称加密算法