codeforces 654 div2 D(思维)

    技术2022-07-20  75

    题目

    文章目录

    思路:AC代码:收获:

    思路:

    若有错误的地方请指正。若读者不理解,欢迎提问

    1 如果k%n==0 ,那么每一行,每一列都有k个1就行,直接错开讲数组置1 2 如果r=k%n,r!=0,先进行操作1。再在前r行,每一行,错开放置一个1

    AC代码:

    #include <bits/stdc++.h> using namespace std; const int maxn = 300+9; int main() { int t; cin>>t; while(t--) { int n,k; int ans = 0; cin>>n>>k; int maxR = k/n;//每一行1的个数 int maxC = 0;//每一列1的个数 maxC = maxR; int r = k%n; if(r) ans = 2; else ans = 0; int R[maxn]; int C[maxn]; int a[maxn][maxn]; cout<<ans<<endl; memset(R,0,sizeof(R)); memset(C,0,sizeof(C)); memset(a,0,sizeof(a)); //r = 2*r; int t = 0; //先每一行错开置1 for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { if(R[i]<maxR&&C[(j+t)%n]<maxC)//每一行。列1的个数不能超过限制 { a[i][(j+t)%n] = 1;//错开放 R[i]++; C[(j+t)%n]++; } } t++;//注意这里 } //再在前r行,每一行一个1,空的位置,错开置1 if(r) { t = 0; for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { if(a[i][(j+t)%n]==0&&r) { a[i][(j+t)%n] = 1; r--; break;//一行只放一个 } } t++; } } //输出 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.014, SQL: 9