标签:img 不重复 gif one failed 程序 含义 输出 str
在一张由M×N个小正方形格子组成的矩形纸张上,有k个格子被涂成了黑色。给你一张由m×n个同样小正方形组成的矩形卡片,请问该卡片最多能一次性覆盖多少个黑格子?
输入共k+1行:
第1行为5个整数M、N、m、n、k,其含义如题目所述。
接下来k行,每行2个整数,分别表示被涂成黑色的格子的行、列坐标。
共1行,1个整数,表示卡片一次性最多能覆盖的黑格子数。
3 5 2 2 3
1 1
2 2
3 5
2
根据样例数据所得到的涂完黑格的矩形和用于覆盖的矩形如下图所示:
对于40%的数据:m=n;
对于100%的数据:M、N、m、n、k 均小于等于1000,所有黑格不重复出现。
二维前缀和模板题,注意纸张可以旋转。
#include<iostream> #include<algorithm> using namespace std; int M,N; int m,n; int k; int a[1001][1001]; int b[1001][1001]; int ans,bns; int main() { cin>>M>>N>>m>>n>>k; for(int i=1,x,y;i<=k;i++) { cin>>x>>y; a[x][y]=1; } for(int i=1;i<=M;i++) { for(int j=1;j<=N;j++) { b[i][j]=a[i][j]+b[i-1][j]+b[i][j-1]-b[i-1][j-1]; } } for(int i=1;i<=M;i++) { for(int j=1;j<=N;j++) { ans=max(b[i][j]-b[max(0,i-m)][j]-b[i][max(0,j-n)]+b[max(0,i-m)][max(0,j-n)],ans); bns=max(b[i][j]-b[max(0,i-n)][j]-b[i][max(0,j-m)]+b[max(0,i-n)][max(0,j-m)],bns); } } cout<<max(ans,bns); return 0; }
标签:img 不重复 gif one failed 程序 含义 输出 str
原文地址:https://www.cnblogs.com/kcn999/p/10624780.html