题解:B4071 [GESP202412 五级] 武器强化
niuniudundun · · 题解
原题
题目大意
有
解法
假设结果为
可以用数组
随后,开贪,既然要求最少花费,那么就将
排序后,核心来了。定义
小杨最喜欢第
1 种武器,因此他希望适配该武器的强化材料种类数严格大于其他的武器,请你帮小杨计算为了满足该条件最少需要花费多少金币。
所以我们尽量使用
如何算当前花费呢?先令
假设
最后对
最后开 long long 就行了。
代码
#include<iostream>
#include<bits/stdc++.h>
#include<algorithm>
using namespace std;
const int maxm=1001,maxn=maxm;
long long n,m,p[maxn],c[maxm];
long long cnt[maxn];
vector<int> cs[maxn];
long long ans=1e18;
long long f(int ii){
long long curcnt=cnt[1],res=0;
vector<int> tmp;
for(int i=2;i<=n;i++){
int b=max((int)(cs[i].size()-ii+1),0);
for(int j=0;j<b;j++){
res+=cs[i][j];
}
curcnt+=b;
for(int j=b;j<cs[i].size();j++){
tmp.push_back(cs[i][j]);
}
}
sort(tmp.begin(),tmp.end());
for(int i=0;i<ii-curcnt;i++){
res+=tmp[i];
}
return res;
}
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>p[i]>>c[i];
cnt[p[i]]++;
cs[p[i]].push_back(c[i]);
}
for(int i=1;i<=n;i++){
sort(cs[i].begin(),cs[i].end());
}
for(int i=max((long long)(cnt[1]),1ll);i<=m;i++){//注意范围!
ans=min(ans,f(i));
}
cout<<ans<<endl;
return 0;
}