Codeforces Round #523 (Div. 2)B. Views Matter

Whiteying

2018-11-23 01:31:28

Personal

# 题目链接: http://codeforces.com/contest/1061/problem/B # 题意: 对一堆箱子进行删除操作,使得删除后的前视图和左视图与未删前的相同,求最大删除数量 注意:虽然最初所有的块都堆叠在地板上,但是在移除一些块之后,不需要它们保持与地板的连接。整堆箱子没有重力,所以即使把下面的木块移走,也不会有木块掉下来。 # 思路: 先对整个数组从小到大排序,将数组中的最后一个看作墙面,很容易证明每一列箱子都要删去它本身高度减一,创建一个检验线,如果当前的箱子高度大于等于检验线,将墙面扣去一个箱子,直至检验线等于墙面的高度。 for循环从1到n-1,忽略墙面。 # AC代码: ```cpp #include<cstdio> #include<iostream> #include<string> #include<cstring> #include<algorithm> using namespace std; long long n,m; long long a[100005]; long long ans; int cnt=1; int main() { scanf("%lld%lld",&n,&m); for(int i=1;i<=n;i++) scanf("%lld",&a[i]); if(n==1) { printf("0\n"); return 0; } sort(a+1,a+n+1); for(int i=1;i<=n-1;i++) { ans+=a[i]-1; if(a[i]>=cnt&&cnt<a[n]) { cnt++; ans++; } } printf("%lld\n",ans); return 0; } ```