A. Maximal Binary Matrix
题意:有一个n*n的矩阵,起初所有元素都为0,向其中填m个1,使其是一个对称矩阵,且自上向下,自左向右比较是字典序最大的矩阵,输出;
解法:因为要满足自上向下自左至右最大,所以就自上向下自左至右最大的填1,对角线填一个1,非对角线填他和他对称的位置,如果最后1的剩余数目不为0,输出-1,否则输出矩阵;
Code:
#include <bits/stdc++.h>
using namespace std;
int n,m;
int mp[100][100];
int main()
{
scanf("%d%d",&n,&m);
for(int i=0; i<n; i++)
{
for(int j=i; j<n; j++)
{
if(i==j&&m>0)mp[i][j]=1,m--;
else if(j!=i&&m>1)
{
mp[i][j]=mp[j][i]=1;
m-=2;
}
}
}
if(m==0)
{
for(int i=0; i<n; i++)
{
for(int j=0; j<n-1; j++)
{
printf("%d ",mp[i][j]);
}
printf("%d\n",mp[i][n-1]);
}
}
else
{
printf("-1\n");
}
return 0;
}
B. Distances to Zero
题意:输如一个数列,输出其中每一个非零数到相邻最近的0的距离,构成的数列;
题解:记录0的位置,扫数组时,遇到非0数就取他与前后的0的距离的最小值;
Code:
#include <bits/stdc++.h>
using namespace std;
int a[2*100005] , pz[2*100005] , res[2*100005] ;
int n;
int main()
{
scanf("%d",&n);
int k=0,am=-1000000005;
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
if(a[i]==0)pz[k++]=i;
}
k=0;
int flag=0;
for(int i=1;i<=n;i++)
{
int ans=abs(i-pz[k]);
if(k>0)
{
if(ans>0)ans=min(ans,abs(i-pz[k-1]));
}
if(ans==0)k++;
if(flag)
printf(" ");
flag=1;
printf("%d",ans);
}
printf("\n");
return 0;
}