朋友与餐厅(Friends.cpp)—CF1729D—1200
时间限制 2s | 空间限制 256M
题目描述:
一群n个朋友决定去一家餐馆。每个朋友计划点xi份餐,总共有份餐yi(1<=i<=n)。
朋友们决定将他们的餐馆之行分成几天。每天,至少两个朋友组成一个小组去餐馆。每个朋友至多只能去一次餐馆(也就是说,这些小组不能相交)。这些小组必须满足每个小组的总预算不能少于该小组中的朋友们在餐馆消费的金额。换句话说,小组中所有x_i的值之和不能超过小组中所有yi的值之和。
问朋友们最多可以连续几天去餐馆?
例如,假设有n=6个朋友,他们的x值为[8,3,9,2,4,5],y值为[5,3,1,4,5,10]。那么:
-
第一和第六个朋友可以在第一天去餐馆。他们在餐馆的消费为8+5=13份,总预算为5+10=15份。因为15>=13,所以他们可以组成一个小组。
-
索引为2,4,5的朋友可以组成第二个小组。他们在餐馆的消费为3+2+4=9份,总预算为3+4+5=12份(12>=9)。
可以证明他们无法再组成更多的小组,以保证每个小组至少有两个朋友且每个小组能支付账单。
因此,朋友们最多可以分成2个小组。朋友们最多连续两天去餐馆。注意第三个朋友根本不去餐馆。
输出朋友们在给定n、x和y的情况下能够连续访问餐馆的最大天数。
输入描述
输入格式:
输入的第一行包含一个整数 t(1<=t<=10^4)——测试中的测试用例数量。
以下是每个测试用例的描述。
每个测试用例的第一行包含一个整数 n(1<=n<=10^5)——朋友的数量。
每个测试用例的第二行包含 n 个整数 x1,x2,…,xn( 1<=xi<=10^9)。xi的值对应于编号为 i 的朋友计划在餐厅花费的钱。
每个测试用例的第三行包含 n 个整数 y1,y2,…,yn( 1<=yi<=10^9)。yi的值对应于编号为i的朋友所拥有的钱。
保证所有测试用例中n值的总和不超过 10^5。
输出格式:
对于每个测试用例,输出访问餐厅的最大天数。如果朋友们无法组成至少一个团体去餐厅,输出0。
样例输入输出:
样例1输入 | 样例1输出 |
---|---|
6 6 8 3 9 2 4 5 5 3 1 4 5 10 4 1 2 3 4 1 1 2 2 3 2 3 7 1 3 10 6 2 3 6 9 5 7 3 2 7 10 6 10 6 5 4 2 1 8 100 1 1 1 1 1 200 6 1 4 1 2 4 2 1 3 3 2 3 4 |
2 0 1 3 1 3 |
样例解释:
在问题陈述中解释了第一个测试案例。
第二个测试案例中,朋友们无法组成至少一个由两个或更多人组成的团体。
在第三个测试案例中,一种在一天内参观餐厅的方式是以全部三个朋友一组前去(1+3+102>=3+7) 。注意他们没有将自己分成两个团体的选择。
题解:
贪心,找xi与yi的差,双指针从头和尾找。
参考代码:
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int t,n,ans;
int a[N],b[N],d[N];
void solve()
{
ans=0;
int i=0,j=n-1;
for(int i=0;i<n;i++)
d[i]=b[i]-a[i];
sort(d,d+n);
while(i<j)
{
if(d[i]+d[j]<0) i++;
else
{
ans++;
i++;
j--;
}
}
cout<<ans<<endl;
}
int main()
{
cin>>t;
while(t--)
{
cin>>n;
for(int i=0;i<n;i++)
cin>>a[i];
for(int i=0;i<n;i++)
cin>>b[i];
solve();
}
return 0;
}