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:學習
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
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
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.排序
3 5 10 1 5
1 3 1
12
2 5 2
3 5 10 1 339
1 3 1
35
5 5 5
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 }