求HACK
查看原帖
求HACK
832774
wish_you_wa_happy楼主2024/12/18 18:47

描述 YYY景点的自助餐厅提供N道主菜和M道配菜。第i道主菜的价格是Ai ,第j道配菜的价格是Bj 。餐厅正在考虑推出新的套餐菜单。一份套餐包括一道主菜和一道配菜。设S是主菜和配菜的价格之和,那么套餐的价格将以S为准,但最大不超过上限P。

显然,菜单中有N×M种主菜和配菜搭配的套餐。求所有这些套餐的总价。

输入 第一行3个以空格分隔的正整数 N, M, P;

第二行N个以空格分隔的正整数,依次表示A1,A2,A3,...AN;

第三行M个以空格分隔的正整数,依次表示B1,B2,B3,...BM;

输出 一个整数,表示答案。

样例 输入 2 2 7 3 5 6 1 输出
24

输入
1 3 2
1
1 1 1

输出
6
输入
7 12 25514963
2436426 24979445 61648772 23690081 33933447 76190629 62703497
11047202 71407775 28894325 31963982 22804784 50968417 30302156 82631932 61735902 80895728 23078537 7723857

输出复制 2115597124

数据范围

对于20%的数据,1≤N,M≤100, 1≤Ai,Bj,P≤100

对于30%的数据,满足Ai+Bj≤P(1≤i≤N, 1≤j≤M)

对于80%的数据,1≤N,M≤200000, 1≤Ai,Bj,P≤5000

对于100%的数据,1≤N,M≤200000, 1≤Ai,Bj,P≤ 1 0 9 10 9

#include <bits/stdc++.h>
//#pragma GCC optimize(3) //?????????2
using namespace std;
long long a[200001];
long long b[200001];
long long s[200001];
int main ()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	long long n,m,p;
	cin>>n>>m>>p;
	for (int i=1;i<=n;i++)cin>>a[i];
	for (int i=1;i<=m;i++)cin>>b[i];
	sort(a+1,a+1+n);
	sort(b+1,b+1+m);
	long long sum=0;
	for (int i=1;i<=m;i++)s[i]=s[i-1]+b[i];
	for (int i=1;i<=n;i++)
	{
		int l=0,r=m,ans=0;
		while (l<r)
		{
			int mid=(l+r)/2;
			if (b[mid]+a[i]<=p)ans=mid,l=mid+1;
			else r=mid-1;
		}
		sum+=s[ans]+ans*a[i]+(m-ans)*p;
	}
	cout<<sum;
	return 0;
}
2024/12/18 18:47
加载中...