题目:
题解:
用两个set找出重复的元素,然后对两场比赛分别排名,返回排名数减去每次之前重复小队数量最小值即可。
#include<bits/stdc++.h>
using namespace std;
struct aa
{
string name;
int j,t;
};
aa itema[100050];
aa itemb[100050];
unordered_set<string>s1;
unordered_set<string>s2;
signed main(){
int n,m;
scanf("%d",&n);
for(int i=0;i<n;i++){
char ss[15];
scanf("%s%d%d",ss,&itema[i].j,&itema[i].t);
itema[i].name+=ss;
s1.insert(itema[i].name);
}
scanf("%d",&m);
for(int i=0;i<m;i++){
char ss[15];
scanf("%s%d%d",ss,&itemb[i].j,&itemb[i].t);
itemb[i].name+=ss;
if(s1.find(itemb[i].name)!=s1.end())s2.insert(itemb[i].name);
}
sort(itema,itema+n,[&](aa a,aa b)->bool{
if(a.j!=b.j)return a.j>b.j;
return a.t<b.j;});
sort(itemb,itemb+m,[&](aa a,aa b)->bool{
if(a.j!=b.j)return a.j>b.j;
return a.t<b.j;});
int ans=0x3f3f3f3f;
int r=0;
for(int i=0;i<n;i++){
if(itema[i].name!="lzr010506"){
if(s2.find(itema[i].name)!=s2.end())++r;
continue;
}
ans=min(ans,i+1-r);
}
r=0;
for(int i=0;i<n;i++){
if(itemb[i].name!="lzr010506"){
if(s2.find(itemb[i].name)!=s2.end())++r;
continue;
}
ans=min(ans,i+1-r);
}
cout<<ans<<endl;
return 0;
}