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

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;
}

    

posted @ 2018-06-15 15:31  nervending  阅读(534)  评论(2编辑  收藏  举报