D - Grid-00100(Codeforces Round #654 (Div. 2))

Posted blowhail

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了D - Grid-00100(Codeforces Round #654 (Div. 2))相关的知识,希望对你有一定的参考价值。

题目链接:https://codeforces.com/contest/1371/problem/D

思路: 模拟一下在矩阵中挨个放1的过程,放的时候,每次斜着放n个,如果放不下了就放对角,画个图演示一下。

技术图片

 

如图,放完9之后,把10放到右上角。 13之后,把14,15也放到右上角。 每次都放n个,左下的区域放不下了再放到右上的区域里,模拟一下这个过程。

 

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
#include <stack>
#include <queue>
#include <cmath>
#define ll long long
#define pi 3.1415927
#define inf 0x3f3f3f3f
#define mod 1000000007
using namespace std;
int n,m;
int a[305][305];
int main ()
{
    int T,i,t,j,k,p,sum=0;
    cin>>T;
    while (T--)
    {
        memset(a,0,sizeof(a));
        cin>>n>>k;
        t=1;
        while (k)
        {
            for(i=t;i<=n;++i){  //放置左下的区域 
                if(a[i][i-t+1]==0 &&k)
                    a[i][i-t+1]=1,k--;
            }
            for(j=1;j<t;++j) //放置右上角的区域
                if(a[j][n-t+j+1]==0 &&k)
                    a[j][n-t+j+1]=1,k--;
            t++;
        }
for(i=1;i<=n;++i) for(j=1;j<=n;++j) a[0][j]+=a[i][j],a[i][0]+=a[i][j]; //计算行与列的和

int rmax=0,rmin=n,cmax=0,cmin=n; for(i=1;i<=n;++i) //找出最大值和最小值 rmax=max(rmax,a[0][i]),rmin=min(rmin,a[0][i]), cmax=max(cmax,a[i][0]),cmin=min(cmin,a[i][0]);
sum
=(rmax-rmin)*(rmax-rmin)+(cmax-cmin)*(cmax-cmin); cout<<sum<<endl; for(i=1;i<=n;++i){ for(j=1;j<=n;++j) cout<<a[i][j]; cout<<endl; } } return 0; }

 

以上是关于D - Grid-00100(Codeforces Round #654 (Div. 2))的主要内容,如果未能解决你的问题,请参考以下文章

D. Grid-00100(构造啊啊啊啊啊啊啊啊啊啊啊啊啊啊)

Codeforces 629D.( Babaei and Birthday Cake)

[2016-03-23][codeforces][560][D][Equivalent Strings]

codeforces 85D. Sum of Medians

codeforces #309 D

codeforces 628D. Magic Numbers 数位dp