本題屬於貪心。
技能分數對總分的貢獻是十分一個檔次。
注意到如下事實:若是要加點,則先加給「效果好的」比較覈算。
有一個技能是「9」點,有一個技能是「1」點, 當然是加給「9」點的技能比較好。
所以,根據「要到下一個檔次還要加多少點」從小到大排序。
先儘量把所有技能都加到下一個檔次。
然後再儘量加到滿分100分。時刻注意不要超過 k <script type="math/tex" id="MathJax-Element-11">k</script> 的限制。
#include<bits/stdc++.h>
#define fi first
#define se second
using namespace std;
const int maxn = 2e5+7;
int a[maxn],m[maxn];
main(){
int n,k;
scanf("%d%d", &n, &k);
vector<pair<int,int> > v;
int www = 0;
for(int i = 1;i<=n;i++){
scanf("%d", &a[i]);
if(a[i]!=100){
int c = 10*(a[i]/10+1);
v.push_back(make_pair(c-a[i],a[i]));
}else{
www+=10;
}
}
sort(v.begin(),v.end());
for(int i = 0;i<v.size();i++){
if(v[i].fi != 0){
if(v[i].fi>k){
break;
}else{
k-=v[i].fi;
v[i].se+=v[i].fi;
v[i].fi = 0;
}
}
}
for(int i = 0;i<v.size();i++){
if(100-v[i].se<=k){
k-=(100-v[i].se);
v[i].se = 100;
}else{
while(k>=10 && v[i].se<100){
k-=10;
v[i].se+=10;
}
}
}
int re = www;
for(int i = 0;i<v.size();i++){
re+=v[i].se/10;
}
cout << re << endl;
}