Friends and the Restaurant

题目描述:
一群 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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值