本文已参与「新人创作礼」活动,一起开启掘金创作之路。
题意:
给你每个人的实际花费和对应的预算,要至少两个人组成一队买东西,问最多可以组多少组。
思路:
先把每个人的d=预算-花费算出来,再排序,最后d从大到小遍历,用双指针找出最多的组数:设当前遍历到,则左指针判断当前是否大于等于0,是则i和j可以组成一组,否则j继续向左查询。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define endl '\n'
struct node{
ll x,y,d;
friend bool operator < (node a,node b){
return a.d < b.d;
}
}a[200005];
void solve()
{
int n;
cin>>n;
int ans = 0;
for(int i = 1; i <= n; i++){
cin>>a[i].x;
}
for(int i = 1; i <= n; i++){
cin>>a[i].y;
a[i].d = a[i].y - a[i].x;
}
sort(a+1,a+1+n);
int l = 1,r = n;
ll sum = 0;
for(int i = n; i > l; i--){
sum = a[i].d;
while(l < i){
if(a[l].d + sum >= 0){
ans++;
l++;
break;
}
l++;
}
}
cout<<ans<<endl;
}
int main()
{
int t;
cin>>t;
while(t--){
solve();
}
}```