codeforces 654 div2 D(思维)
思路:
若有错误的地方请指正。若读者不理解,欢迎提问
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;
}
收获:
如何给 矩阵错赋值
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话