刚开始写的二维矩阵模拟,只过了70%:
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1010;
int a[N][N];
int cnt[N][N];
int n, m, sum,h;
void sovel()
{
cin >> n >> m;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
cin >> a[i][j];
cin >> h;
for(int i = 1; i <= h; i++)
{
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= m; j++)
{
if (a[i][j] != 0)
{
cnt[i][j]++;
a[i][j]--;
}
}
}
sum = 0;
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= m; j++)
{
sum += cnt[i][j];
}
}
cout << sum << endl;
}
}
signed main()
{
cin.tie(nullptr)->sync_with_stdio(false);
sovel();
return 0;
}
看评论区都进行了降维处理:
#include<bits/stdc++.h>
using namespace std;
int n,m;
const int N=1e6+10;
int num[N];
int main()
{
cin>>n>>m;
long long sum=0;
for(int i=1;i<=n*m;i++)
{
int x;cin>>x;
if(x) //如果不是平地的话
{
sum++; //统计一下 楼 的数量
num[x]++; //统计一下每种高度的 积木 的 个数
}
}
int h;cin>>h;
long long ans=0;
for(int i=1;i<=h;i++)
{
ans+=sum; //加上 被水淹没的格子数量
cout<<ans<<endl;
sum-=num[i]; //涨水之后 总共的格子数量要减去水位高度的格子的数量
}
return 0;
}