花束搭配【算法赛】

0花束搭配【算法赛】 - 蓝桥云课

问题描述

为了庆祝三八妇女节,花店推出了“双花搭配”活动。花店中有 n 种鲜花,每种鲜花有两种属性:

  • 放在花束外部时,艳丽度为 Ai​;
  • 放在花束内部时,艳丽度为 Bi​。

一束花需要由两种不同的鲜花组成,一种放在外部,另一种放在内部。如果一束花的“外部艳丽度之和”大于“内部艳丽度之和”,即满足 Ai​+Aj​>Bi​+Bj​,则这束花被认为是“完美搭配方案”。

现在,给定 n 种鲜花的艳丽度数组 A 和 B,请你帮助计算有多少种“完美搭配方案”。

注意,(i,j) 和 (j,i) 被视为不同的组合。

输入格式

第一行包含一个整数 n(1≤n≤2×105),表示鲜花的种类数。

第二行包含 n 个整数 A1​,A2​,…,An​(1≤Ai​≤109),表示每种鲜花放在外部的艳丽度。

第三行包含 n 个整数 B1​,B2​,…,Bn​(1≤Bi​≤109),表示每种鲜花放在内部的艳丽度。

输出格式

输出一个整数,表示“完美搭配方案”的数量。

样例输入

3
2 3 4
4 3 2

样例输出

2

说明

对于样例,(2,3) 与 (3,2) 是完美搭配方案。


希望这个格式化文档符合你的要求。如果有任何进一步的修改需求,请告诉我。

思路:

暴力暴力

代码如下:
 

#include 
#include
using namespace std;
typedef long long ll;
const ll N = 2e5+10;
ll a[N],b[N],c[N],d[N];
ll ans = 0,cnt;
bool check(ll mid,ll k)
{    
    if(d[mid] < k)
    return true;
    else
    return false;
}
int main() 
{
     ios::sync_with_stdio(0);
     cin.tie(0);
     cout.tie(0);
     ll n;
     cin >> n;
     for(ll i = 1 ; i <= n ; i++)
     cin >> a[i];
     for(ll i = 1 ; i <= n ; i++)
     cin >> b[i];
    for(ll i = 1 ; i <= n ; i++)//Ai - Bi > Bj - Aj变成c[i] > d[j] 
    {
        c[i] = a[i] - b[i];
        d[i] = b[i] - a[i];
    }
	for(ll i  = 1 ; i <= n ; i++)
	{
		for(ll j = 1 ; j <= n ; j++)
		{
			if(i == j)continue;
			else if(c[i] > d[j])
			{
				ans++;
			}
		}
	 } 
	 cout << ans;
    return 0;
}
/*
Ai - Bi > Bj - Aj
*/

花束搭配【算法赛】_第1张图片

二分:

#include 
#include
using namespace std;
typedef long long ll;
const ll N = 2e5+10;
ll a[N],b[N],c[N],d[N];
ll ans = 0,cnt;
bool check(ll mid,ll k)
{    
    if(d[mid] < k)
    return true;
    else
    return false;
}
int main() 
{
     ios::sync_with_stdio(0);
     cin.tie(0);
     cout.tie(0);
     ll n;
     cin >> n;
     for(ll i = 1 ; i <= n ; i++)
     cin >> a[i];
     for(ll i = 1 ; i <= n ; i++)
     cin >> b[i];
    for(ll i = 1 ; i <= n ; i++)
    {
        c[i] = a[i] - b[i];
        d[i] = b[i] - a[i];
    }
    sort(d + 1, d + 1 + n);
    for(ll i = 1 ; i <= n ; i++)
    {
        ll l = 0 , r = n+1;
        while(l + 1 != r)
        {
            ll mid = (l + r) / 2;
            if(check(mid,c[i]))
            {
                l = mid;
            }
            else
            {
                r = mid;
            }
        }
        ans += l;
        if(c[i] > 0)
        ans--;   
    }

    cout << ans;
    return 0;
}
/*
Ai - Bi > Bj - Aj
*/

你可能感兴趣的:(算法,暴力,二分,模拟)