Skills - CF613B

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.ide

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.this

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).spa

The second line contains exactly n integers ai (0 ≤ ai ≤ A), separated by spaces, — the current levels of skills.code

Output

On the first line print the maximum value of the Force that the character can achieve using no more than m currency units.blog

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 test(s)
Input
3 5 10 1 5
1 3 1
Output
12
2 5 2
Input
3 5 10 1 339
1 3 1
Output
35
5 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.ip

In the second test one should increase all skills to maximum.ci

簡單題意input

你有n個技能能夠學,你有m個技能點能夠分配,每一個技能的上限值都是A,每一個技能都給出了至少要學的等級,而後你要合理分配技能點,使得戰力最大

戰力=滿級技能*Cf+最小等級*Cm

而後咱們枚舉滿級的技能個數,顯然咱們應該把那些至少學習等級大的點成滿級,而後剩下的技能儘可能最小等級最大

因此咱們一開始從小到大排序,枚舉後面i個變成滿級,前面的二分最小等級,用前綴和判斷可行性,而後計算出戰力,更新答案

 1 #include<cstdio>
 2 #include<algorithm>
 3 using namespace std;
 4 
 5 const int maxn=100100;
 6 
 7 long long A,cf,cm,n,w,a[maxn],b[maxn],s[maxn],ans,tmp1,tmp2;
 8 
 9 bool compare(long long x,long long y){
10     return a[x]<a[y];
11 }
12 
13 long long find(long long x,long long rr){
14     long long l,r,mid;
15     l=0;r=rr;
16     while(l!=r){
17         mid=(l+r+1)/2;
18         if(a[b[mid]]<x)l=mid;
19         else r=mid-1;
20     }
21     return l;
22 }
23 
24 int main(){
25     scanf("%I64d%I64d%I64d%I64d%I64d",&n,&A,&cf,&cm,&w);
26     long long i;
27     for(i=1;i<=n;i++)scanf("%I64d",&a[i]);
28     for(i=1;i<=n;i++)b[i]=i;
29     sort(b+1,b+1+n,compare);
30     for(i=1;i<=n;i++)s[i]=s[i-1]+a[b[i]];
31     w+=s[n];
32     ans=-1;
33     for(i=1;i<=n+1;i++){
34         if(A*(n-i+1)+s[i-1]>w)continue;
35         if(i==1)ans=cf*n+cm*A,tmp1=1;
36         if(i==1)break;
37         long long l=a[b[1]],r=A,mid,tt;
38         while(l!=r){
39             mid=(l+r+1)/2;
40             tt=find(mid,i-1);
41             if(A*(n+1-i)+mid*tt+s[i-1]-s[tt]<=w)l=mid;
42             else r=mid-1;
43         }
44         if(ans<cf*(n+1-i)+l*cm)ans=cf*(n+1-i)+l*cm,tmp1=i,tmp2=l;
45     }
46     printf("%I64d\n",ans);
47     for(i=1;i<tmp1;i++)
48     if(a[b[i]]<tmp2)a[b[i]]=tmp2;
49     for(i=tmp1;i<=n;i++)a[b[i]]=A;
50     for(i=1;i<=n;i++)printf("%I64d ",a[i]);
51     return 0;
52 }
AC代碼
相關文章
相關標籤/搜索