CodeForces 1371D Grid-00100(贪心)

    技术2022-07-17  82

    题意:指定n*n的矩阵大小以及其中1的个数k。用Ri表示每行1的个数和,Ci表示每列1的个数和,f(A)=(max(Ri) − min(Ri))2 + (max(Ci) − min(Ci))2,求最小的f(A)并给出相应的01矩阵。

    题解:贪心 我们发现,f(A)只可能有0或2这两个值,因为我们可以依次给每行或每列分配1,若每行或列都有相等的1,即k%n=0,答案就是0,否则就是1。

    我们在分配的时候,肯定是按照对角线来放置1的。 比如k=3的时候: 1 0 0 0 1 0 0 0 1 当k=6的时候,我们还是按照上述思想放置1,即原来对角线向右平移: 1 1 0 0 1 1 0 0 1 1 对于多出来的1,我们只要进行列号取余,就变成: 1 1 0 0 1 1 1 0 1 由于题目条件,我们不必担心取余的1会覆盖原来有1的位置。

    #define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<cstdio> #include<string> #include<cstring> #include<algorithm> #include<queue> #include<stack> #include<cmath> #include<vector> #include<fstream> #include<set> #include<map> #include<sstream> #include<iomanip> #define ll long long using namespace std; int t, n, k, a[300][300]; int main() { scanf("%d", &t); while (t--) { memset(a, 0, sizeof(a)); scanf("%d%d", &n, &k); int num = k / n; for (int i = 0; i < num; i++) { for (int j = 0; j < n; j++) { a[j][(j + i) % n] = 1; } } if (k % n == 0) puts("0"); else { puts("2"); int shen = k - num * n; for (int j = 0; j < shen; j++) { a[j][(j + num) % n] = 1; } } for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { printf("%d", a[i][j]); } printf("\n"); } } return 0; }
    Processed: 0.025, SQL: 10