题目链接:http://codeforces.com/contest/1089/problem/L
题意是有n个人,m份工作,每份工作的编号是1-m,然后输入n个ai,第二行输入n个bi,ai代表当前第i个人所选的工作编号,bi代表如果让这个人去换一个工作所需要花费的权值,现在要让每一份工作都有人去做,问最少需要花费多少可以实现。
思路就是在输入的时候把每个工作的人数记录下来然后记录一下有多少个工作没有人做,然后对这n个人按照权值从小到大排个序,遍历排序后的每个人,如果这个人选的工作有多个人选了,就让他去选别的工作就行了。
AC代码:
代码语言:javascript复制#include <bits/stdc .h>
#define ll long long
#define maxn 100005
using namespace std;
struct Node{
int id;
ll w;
bool operator < (const Node &a) const{
return a.w > w;
}
}Edge[maxn];
map<int,int> ma;
int n,m;
int main()
{
scanf("%d%d",&n,&m);
int ans = 0;
for(int i=1;i<=n;i ){
scanf("%d",&Edge[i].id);
if(ma[Edge[i].id] == 0) ans ;
ma[Edge[i].id] ;
}
for(int i=1;i<=n;i ){
scanf("%lld",&Edge[i].w);
}
ans = m - ans;
ll sum = 0;
sort(Edge 1, Edge 1 n);
for(int i=1;i<=n && ans!=0;i ){
if(ma[Edge[i].id] > 1){
ma[Edge[i].id] --;
sum = Edge[i].w;
ans--;
}
}
printf("%lldn",sum);
return 0;
}