这题是红题,我都觉得我的题解过不了
这道题输入不像别的题,给一个参数 n ,然后输入 n 的倍数个数据,它是给一个 n ,
再输入一堆数。看题目,n × n ? 是不是就说明了给出的数和一定,都是 n × n ?
显然是的。
这样就好办了:
#define maxn 40010
int n,a[maxn],f,i,j,s;
int read(){//快读
int r=0,f=1;//r置零,f为标记,正数与负数
char c=getchar();//字符c的读入
while((c<'0'||c>'9')&&c!='-')//读入其他字符
c=getchar();
if(c=='-')//若该数为负数
f=-1,c=getchar();
while(c<='9'&&c>='0')//读入数字
r=r*10+c-'0',c=getchar();
return r*f;//正还是负
}
n=read();
while(s<n*n)
a[++f]=read(),s+=a[f];
看上去很冗长,但知识点只有 #define、上面推出来的输入方式和快读。
快读?
大家肯定会疑惑:快读是什么?
快读,从字面上来理解就是快速读入。
快读的本质就是将读入一个整数转化为输入一个字符再减 ‘0’ 。
为什么呢?因为输入一个字符再减 ‘0’ 比读入一个整数快很多。
但这里数据不大,可用可不用
define 则是定义。如上 #define maxn 40010 则是定义 maxn 为 40010。
接下来往下走。
输出时,必须要记得换行,否则会错。
那么应该怎么实现呢?
s=0;//前面用过,置零
for(i=1;i<=f;i++){//i循环,导出数组
if(i%2)//i的奇偶性
for(j=1;j<=a[i];j++){//j循环,输出0
printf("0");
s++;//计数换行标志
if(s%n==0)
printf("\n");//特判换行
}
else//否则,因为i mod 2不是1就是0
for(j=1;j<=a[i];j++){//j循环,输出1
printf("1");
s++;//计数换行标志
if(s%n==0)
printf("\n");//特判换行
}
}
我觉得这道题也就这些知识点了 应该是我太弱才没有发现其他知识点
下面贴出完整代码:
#include<bits/stdc++.h>
#define maxn 40010
using namespace std;
int n,a[maxn],f,i,j,s;
int read(){
int r=0,f=1;
char c=getchar();
while((c<'0'||c>'9')&&c!='-')
c=getchar();
if(c=='-')
f=-1,c=getchar();
while(c<='9'&&c>='0')
r=r*10+c-'0',c=getchar();
return r*f;
}
int main(){
n=read();
while(s<n*n)
a[++f]=read(),s+=a[f];
s=0;
for(i=1;i<=f;i++){
if(i%2)
for(j=1;j<=a[i];j++){
printf("0");
s++;
if(s%n==0)
printf("\n");
}
else
for(j=1;j<=a[i];j++){
printf("1");
s++;
if(s%n==0)
printf("\n");
}
}
return 0;
}
洛谷加油!OI冲鸭!