·描述
小杨有种武器和
种强化材料。第
种强化材料会适配第
种武器,小杨可以花费
金币将该材料对应的适配武器修改为任意武器。
小杨最喜欢第 种武器,因此他希望适配该武器的强化材料种类数严格大于其他的武器,请你帮小杨计算为了满足该条件最少需要花费多少金币。
·输入描述
第一行包含两个正整数 ,
,含义如题面所示。
之后 m 行,每行包含两个正整数 ,
,代表第
种强化材料的适配武器和修改花费。
·输出描述
输出一个整数,代表能够使适配第 种武器的强化材料种类数严格大于其他的武器最少需要花费的金币。
·样例输入 1
4 4
1 1
2 1
3 1
3 2
·样例输出 1
1
·数据范围与提示
对于 100% 的数据,保证 1≤n,m≤1000,1≤pi≤n,1≤ci≤109。
| 子任务编号 | 得分占比 | n | m |
|---|---|---|---|
| 1 | 20% | ≤2 | ≤1000 |
| 2 | 20% | ≤1000 | ≤2 |
| 3 | 60% | ≤1000 | ≤1000 |
样例解释
花费 1,将第三种强化材料的适配武器由 3 改为 1。此时,武器 1 有 2 种强化材料适配,武器 2 和武器 3 都各有 1 种强化材料适配,满足适配第 1 种武器的强化材料种类数严格大于其他的武器。
代码:
#include<bits/stdc++.h>
using namespace std;
int n,m;
int cn[1010];
vector<int> cs[1010];
long long cl(int a){
int ct=cn[1];
long long rs=0;
vector<int> t;
for(int i=2; i<=n;i++) {
int b=max((int)cs[i].size()-a+1,0);
for(int j=0;j<b;++j){
rs+=(long long)cs[i][j];
}
ct+=b;
for(int j=b;j<cs[i].size();++j) {
t.push_back(cs[i][j]);
}
}
sort(t.begin(),t.end());
for(int i=0;i<a-ct;i++){
rs+=(long long)t[i];
}
return rs;
}
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
int p,c;
cin>>p>>c;
cn[p]++;
cs[p].push_back(c);
}
for(int i=1;i<=n;i++){
sort(cs[i].begin(),cs[i].end());
}
long long ans=1e18;
for(int i=max(cn[1],1);i<=m;++i){
ans=min(ans,cl(i));
}
cout<<ans;
return 0;
}
225



被折叠的 条评论
为什么被折叠?



