题目描述
餐厅里有 N 个主菜和 M 个副菜,第 i 个主菜的价格为Ai,第 j 个副菜的价格是 Bj。餐厅现在要推出一些套餐,每个套餐均由一道主菜和一道副菜组成,对于一个由第 个主菜和第 j 个副菜组成的套餐,我们定义s=Ai+Bj,那么这个套餐的价格即为 min(s,P),P 为一个给定的常数。
请你求出所有可能的套餐的价格总和。
输入格式
第一行三个整数 N,M,P。
第二行 N 个整数,表示 1,2…A1,A2…AN。
第三行 M 个整数,表示 1,2…B1,B2…BN。
输出格式
一行一个整数表示答案。
题解
二分+前缀和
#include<bits/stdc++.h>
using namespace std;
const int N=1e6;
long long n,m,p,a[N],b[N],pre[N],x,sum;
int main (){
cin>>n>>m>>p;
for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
for(int i=1;i<=m;i++) scanf("%lld",&b[i]);
sort(a+1,a+n+1);
for(int i=1;i<=n;i++) pre[i]=pre[i-1]+a[i];
for(int i=1;i<=m;i++){
x=upper_bound(a+1,a+n+1,p-b[i])-a;
sum+=p*(n-x+1)+b[i]*(x-1)+pre[x-1];
}
cout<<sum;
}