B. Views Matter
题意
从左到右给你n堆正方体,每堆有a[i]个正方体堆在一起,问最多可以拿走多少个正方体使俯视图和右视图都不改变。
做法
有些正方体可以对俯视图和右视图做两次贡献,有些不能做贡献,首先将所有堆排序,之后看当前正方体堆是否可以做两次贡献就可以了。设置一个变量,表示当前需要被贡献的高度,如果当前堆超过需要被贡献的高度,则做两次,变量++。否则做一次贡献。
代码
#include<iostream>
#include<stdio.h>
#include<algorithm>
using namespace std;
typedef long long ll;
const int maxn = 1e5+5;
int a[maxn];
int main()
{
int n,m;
scanf("%d%d",&n,&m);
int maxx=0;
ll sum=0;
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
sum+=a[i];
}
ll ans=0;
ll tmp=0;
sort(a+1,a+1+n);
for(int i=1;i<=n;i++)
{
maxx=max(maxx,a[i]);
if(a[i]>=tmp+1)
{
tmp++;
}
}
printf("%lld\n",sum-(maxx-tmp+n));
return 0;
}