题目
One day n girls and n boys come to Xi’an to look for a mate . Each girl has a value a[i] , each boy has a value b[i]b[i]b[i] . Girl iii and boy j will fall in love only if a[i]+b[j]≥k .Please help them make pairs as many as possible .
Input
Several test cases .
First line an integer T (1≤T≤10) . Indicates the number of test cases.
Then T test cases follows . Each test case begins with two integer N, K (1≤N≤200000,0≤K≤10e+9).The next line has N integers indicate a[1] to a[N] (0≤a[i]≤10e+9) . The next line has N integers indicate b[1] to b[N] (0≤b[i]≤10e+9)
Output
For each test case , print the answer in a single line.
样例输入
1
3 4
1 2 3
1 2 3
样例输出
3
题目大意
就是有n个男生和n个女生,他们每个人身上都有一个魅力值,如果一个男生和一个女生的魅力值之和大于等于K,那么他们俩就能在一起。问给出男女生的魅力值,最多能有多少男女成为情侣。
解题思路
把男女的魅力值排序,然后用第一个女生的魅力值跟最后一个男生相加求和,如果不满足条件,女生不动,再用上一个男生相加,以此类推,直到找出为止。
注意:不能用双重循环会超时
//超时!!!
for(int i=1;i<=n;i++)
for(int j=n;j>=1;j--)
{
if(a[i]+b[j] >=k)
{
ans++;
a[i]=b[i]=0
}
}
//AC代码
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=200003;
int main()
{
int t,n,k;
int a[maxn],b[maxn];
cin >>t;
while(t--)
{
cin >>n>>k;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
for(int i=1;i<=n;i++)
{
cin>>b[i];
}
int ans=0;
sort(a+1,a+1+n);
sort(b+1,b+1+n);
int j = n;
for (int i =1; i <=n; i++)
{
if(a[i]+b[j]>=k)
{
j--;
ans++;
}
}
cout <<ans<<endl;
}
return 0;
}