题解 P1319 【压缩技术】

这题是红题,我都觉得我的题解过不了

这道题输入不像别的题,给一个参数 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冲鸭!

转载于:https://www.cnblogs.com/SeashellBaylor/p/11079819.html

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值