Codeforces Round #820 (Div. 3)D. Friends and the Restaurant

164 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

传送门 image.png

题意:

给你每个人的实际花费和对应的预算,要至少两个人组成一队买东西,问最多可以组多少组。

思路:

先把每个人的d=预算-花费算出来,再排序,最后d从大到小遍历,用双指针找出最多的组数:设当前遍历到did_i,则左指针判断当前di+djd_i+d_j是否大于等于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();
	}
}```