链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
有一堆立方体整齐的堆积在一起,给定这堆立方体的正视图和左视图,求这堆立方体最多可能有多少个。
样例一:
解题步骤
- 把能够唯一确定的先标注出来
- 体积最大:让其他位置尽可能多,但不能违反其他两种视图的约束
- 体积最小:行列相同数交叉位置一次性满足
#include <bits/stdc++.h>
using namespace std;
typedef long long int ll;
ll a[500010];
ll sum[500010];
ll sum1[500010];
ll n;
ll check(int num){
int left = 1,right = n + 1;
int mid = 0;
while (left < right){
mid = left + (right - left) / 2;
if (a[mid] > num) right = mid;
else if (a[mid] < num)
left = mid+1;
else if (a[mid] == num){
return sum[mid];
}
}
return sum[left-1] + (num-a[left-1]) * (n-left+1);
}
int main(){
cin >> n;
for (int i=1; i<=n; i++) {
cin >> a[i];
}
sort(a+1,a+n+1);
for (int i=1; i<=n; i++) {
sum1[i] = sum1[i-1] + a[i];
sum[i] = (n-i) * a[i] + sum1[i];
}
ll t,num = 0,ans = 0;
cin >> t;
while (t--){
cin >> num;
ll number = check(num);
ans += number;
}
cout << ans << endl;
return 0;
}