这题是红题,我都觉得我的题解过不了
这道题输入不像别的题,给一个参数 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冲鸭!