题目描述:
一群 n 朋友决定去一家餐馆吃饭。每个朋友计划点 xi 个布尔的餐,总共有 yi个布尔
朋友们决定分几天去餐厅用餐。每天,至少有两个的朋友去餐厅。每个朋友去餐厅的次数不超过一次(也就是说,这些组不相交)。这些小组必须满足一个条件,即每个小组的总预算必须不小于小组中的朋友将在餐厅消费的布尔数。换句话说,组中所有 x &; i 值的总和不得超过组中 y i 值的总和。
朋友们最多可以去餐厅多少天?
例如,假设有 n = 6 个朋友,其中 x =[ 8, 3, 9, 2, 4, 5 ], y =[ 5, 3, 1, 4, 5, 10]。那么
- 第一个和第六个朋友可以在第一天去餐厅吃饭。他们将在餐厅花费 8+5=13 布尔,他们的总预算是 5+10=15布尔。由于 13<=15 ,他们实际上可以组成一个小组。
- 指数为 2, 4, 5 的朋友可以组成第二个小组。他们将在餐厅消费 3+2+4=9 布尔,总预算为 3+4+5=12 布尔。
可以看出,他们无法组成更多的小组,这样每个小组至少有两个朋友,每个小组都可以付账。
因此,朋友们最多可以分成 2个小组。朋友们最多将在餐厅停留两天。请注意,第 3 个朋友根本不会去餐厅。
在给定 n , x 和 y 的情况下,输出朋友们最多可以去餐厅的天数。
思路分析:
y代表预算,x代表花销,取w=y-x
代表富有程度,然后排序,争取做到一富带一穷,如果要让组数最多,我们就让俩人组队,为什么呢,什么,如果你说一个-100,一个99,一个5怎么办,显然我们不至于把他们三个放一起了,可以直接把-100给踢了所以如果长度>=3时必定有过大的负数,那么我们直接不考虑他了
AC代码:
#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
using namespace std;
int n,t,num;
int x[200005],y[200005],w[200005];
int main()
{
cin>>t;
while(t--)
{
cin>>n;
num=0;
for(int i=0;i<n;i++) cin>>x[i];
for(int i=0;i<n;i++) cin>>y[i],w[i]=y[i]-x[i];//得到差值
sort(w,w+n);//排序穷-->富
int l=0,r=n-1;
while(l<r)
{
if(w[l]+w[r]>=0) //方案可以
l++,r--,num++;//可以向中间看,方案数+1
else
l++;//这个太穷了带不动
}
cout<<num<<endl;
}
return 0;
}