UVALive 8513 lovers 2017 西安区域赛 B 贪心+multiset
有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; }