蓝桥杯 积木 知识点:模拟

66 阅读1分钟

1.积木 - 蓝桥云课 (lanqiao.cn)

刚开始写的二维矩阵模拟,只过了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;
}

image.png

看评论区都进行了降维处理:

#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;
}

image.png