UVALive 8513 lovers 2017 西安区域赛 B 贪心+multiset

时间:2021-04-22 15:42:57

UVALive 8513

有2种人,每个人有自己的权值$A_i$ $B_i$ 当$A_i + B_i >=K$时 两个人可以配对

问最多多少人可以配对

解法 :

  把$/{ A_i /}$ 排序 $/{ B_i /}$ 扔进多重集合里

  每次在集合中找大于等于 $K - A_i$ 的第一个$B_i$ 然后删除元素

  可以有小优化

  但是实际上我不知道我是否正确......

  因为上面挂的数据是假数据,任何输出都能过....

  本来想把17年uvalive真题切一切的,结果一上来就被打脸了...

#include <bits/stdc++.h>
#define ll long long
#define rep(ii,a,b) for(int ii=a;ii<=b;ii++)
using namespace std;
const int maxn=2e5+10;
const int maxm=1e6+10;
const int INF=0x3f3f3f3f;
int casn,n,m;
ll k;
ll a[maxn];
multiset<ll>b;
int vis[maxn];
int main(){
scanf("%d",&casn);
while(casn--){
b.clear();
memset(vis,0,sizeof vis);
scanf("%lld%lld",&n,&k);
rep(i,1,n){
scanf("%lld",a+i);
}
rep(i,1,n){
int x;
scanf("%lld",&x);
b.insert(x);
}
b.insert(INF);
int ans=0;
sort(a+1,a+1+n);
rep(i,1,n){
if(a[i]>=k){
ans+=n-i+1;
break;
}
int pos=*b.lower_bound(k-a[i]);
if(pos==INF)break;
b.erase(pos);
ans++;
}
printf("%d\n",ans+1);
}
return 0;
}