洛谷刷题C语言:压缩技术、压缩技术(续集版)、单词覆盖还原、最长连号、小玉买文具

纪录洛谷刷题QAQ


一、压缩技术

题目描述

设某汉字由 N × N N \times N N×N 0 \texttt 0 0 1 \texttt 1 1 的点阵图案组成。

我们依照以下规则生成压缩码。连续一组数值:从汉字点阵图案的第一行第一个符号开始计算,按书写顺序从左到右,由上至下。第一个数表示连续有几个 0 \texttt 0 0,第二个数表示接下来连续有几个 1 \texttt 1 1,第三个数再接下来连续有几个 0 \texttt 0 0,第四个数接着连续几个 1 \texttt 1 1,以此类推……

例如: 以下汉字点阵图案:

0001000
0001000
0001111
0001000
0001000
0001000
1111111

对应的压缩码是: 7   3   1   6   1   6   4   3   1   6   1   6   1   3   7 \texttt {7 3 1 6 1 6 4 3 1 6 1 6 1 3 7} 7 3 1 6 1 6 4 3 1 6 1 6 1 3 7 (第一个数是 N N N ,其余各位表示交替表示0和1 的个数,压缩码保证 N × N = N \times N= N×N= 交替的各位数之和)

输入格式

数据输入一行,由空格隔开的若干个整数,表示压缩码。

输出格式

表示最后的汉字点阵图(点阵符号之间不留空格)。

样例 #1

样例输入 #1

7 3 1 6 1 6 4 3 1 6 1 6 1 3 7

样例输出 #1

0001000
0001000
0001111
0001000
0001000
0001000
1111111

提示

数据保证, 3 ≤ N ≤ 200 3\leq N\leq 200 3N200

代码如下

#include<stdio.h>
#include<math.h>
#include <stdlib.h>

int main() {
	int N;
	scanf("%d",&N);//找到行数 
	int sum = 0, spot = 0, count = 0;
	while(sum < N*N){
		
		int n;
		scanf("%d",&n);
		for(int i = 0;i < n;i++){
			printf("%d",spot);
			count++;
			sum++;
			if(count == N){
				printf("\n");
				count = 0;
			}
		}
		if(spot == 1)
			spot = 0;
		else
			spot = 1;
	} 
	return 0;
}

二、压缩技术(续集版)

题目描述

设某汉字由 N × N N \times N N×N 0 \texttt 0 0 1 \texttt 1 1 的点阵图案组成。

我们依照以下规则生成压缩码。连续一组数值:从汉字点阵图案的第一行第一个符号开始计算,按书写顺序从左到右,由上至下。第一个数表示连续有几个 0 \texttt 0 0,第二个数表示接下来连续有几个 1 \texttt 1 1,第三个数再接下来连续有几个 0 \texttt 0 0,第四个数接着连续几个 1 \texttt 1 1,以此类推……

例如: 以下汉字点阵图案:

0001000
0001000
0001111
0001000
0001000
0001000
1111111

对应的压缩码是: 7   3   1   6   1   6   4   3   1   6   1   6   1   3   7 \texttt {7 3 1 6 1 6 4 3 1 6 1 6 1 3 7} 7 3 1 6 1 6 4 3 1 6 1 6 1 3 7 (第一个数是 N N N ,其余各位表示交替表示0和1 的个数,压缩码保证 N × N = N \times N= N×N= 交替的各位数之和)

输入格式

汉字点阵图(点阵符号之间不留空格)。

输出格式

输出一行,压缩码。

样例 #1

样例输入 #1

0001000
0001000
0001111
0001000
0001000
0001000
1111111

样例输出 #1

7 3 1 6 1 6 4 3 1 6 1 6 1 3 7

提示

数据保证, 3 ≤ N ≤ 200 3\leq N\leq 200 3N200

代码如下

#include <stdio.h>
#include <math.h>
#include <string.h>
int main(void)
{
	int i,n,count=0;
	char str[40000],temp[200];
	int a[40000],len;
	
	while((scanf("%s",temp))!=EOF)
		strcat(str,temp);
	len=strlen(str);
	n=(int)sqrt(len);
	
	for(i=0;i<=len;i++)
		a[i]=str[i]-'0';
	
	if(a[0]==1)
	{
		printf("%d 0 ",n);
		i++;
	}
	else
		printf("%d ",n);
		
	for(i=0;i<len-1;i++)
	{
		if(a[i]==a[i+1])
			count++;
		else
		{
			printf("%d ",++count);
			count=0;
		}
	}
	if(a[len-2]==a[len-1])
		printf("%d",++count);
	else
		printf("1");
	return 0;
}

三、单词覆盖还原

题目描述

一个长度为 l l l 的字符串中被反复贴有 boygirl 两单词,后贴上的可能覆盖已贴上的单词(没有被覆盖的用句点表示),最终每个单词至少有一个字符没有被覆盖。问贴有几个 boy 几个 girl

输入格式

一行被被反复贴有 boygirl 两单词的字符串。

输出格式

两行,两个整数。第一行为 boy 的个数,第二行为 girl 的个数。

样例 #1

样例输入 #1

......boyogirlyy......girl.......

样例输出 #1

4
2

提示

数据保证, 3 ≤ l ≤ 255 3\le l\le255 3l255,字符串仅仅包含如下字符: .bgilory \texttt{.bgilory} .bgilory

代码如下

#include<stdio.h>
#include<math.h>
#include <stdlib.h>
#include<string.h>
int main() {
    int k,n,m,w;
    char a1[300];
    m=0;
    w=0;
    scanf("%s",a1);
    k=strlen(a1);
    if(k>=3&&k<=255) {
        for (n = 0; n < k; n++) {
            if (a1[n]!='.') {
                if(a1[n]=='b'){
                    m++;
                }
                if(a1[n]=='o'&&a1[n-1]!='b'){
                    m++;
                }
                if(a1[n]=='y'&&a1[n-1]!='o'){
                    m++;
                }
                if(a1[n]=='g'){
                    w++;
                }
                if(a1[n]=='i'&&a1[n-1]!='g') {
                    w++;
                }
                if(a1[n]=='r'&&a1[n-1]!='i'){
                    w++;
                }
                if(a1[n]=='l'&&a1[n-1]!='r'){
                    w++;
                }
            }
        }
    }
    printf("%d\n%d",m,w);
    return 0;
}

四、最长连号

题目描述

输入长度为 n n n 的一个正整数序列,要求输出序列中最长连号的长度。

连号指在序列中,从小到大的连续自然数。

输入格式

第一行,一个整数 n n n

第二行, n n n 个整数 a i a_i ai,之间用空格隔开。

输出格式

一个数,最长连号的个数。

样例 #1

样例输入 #1

10
1 5 6 2 3 4 5 6 8 9

样例输出 #1

5

提示

数据规模与约定

对于 100 % 100\% 100% 的数据,保证 1 ≤ n ≤ 1 0 4 1 \leq n \leq 10^4 1n104 1 ≤ a i ≤ 1 0 9 1 \leq a_i \leq 10^9 1ai109

代码如下

#include <stdio.h>
#include <stdlib.h>
#define M 10000

int main() {
	int n, i, j, count = 0,sum = 0;
	scanf("%d",&n);
	long long int NUM[M];
	for(i = 0;i < n;i++){
		scanf("%lld",&NUM[i]);
	}
		for(j = 0;j <= n;j++){
			if(NUM[j] == NUM[j+1] - 1){
				count++;
				if(count > sum)
					sum = count;
			}
			else count = 0;		
		}

	printf("%d\n",sum+1);
	return 0;
}

五、小玉买文具

题目描述

班主任给小玉一个任务,到文具店里买尽量多的签字笔。已知一只签字笔的价格是 1 1 1 9 9 9 角,而班主任给小玉的钱是 a a a b b b 角,小玉想知道,她最多能买多少只签字笔呢。

输入格式

输入只有一行两个整数,分别表示 a a a b b b

输出格式

输出一行一个整数,表示小玉最多能买多少只签字笔。

样例 #1

样例输入 #1

10 3

样例输出 #1

5

提示

数据规模与约定

对于全部的测试点,保证 0 ≤ a ≤ 1 0 4 0 \leq a \leq 10^4 0a104 0 ≤ b ≤ 9 0 \leq b \leq 9 0b9

代码如下

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
	int a, b;
	while(scanf("%d%d",&a,&b)!=EOF){
		int mon = a*10+b;
		int sum = mon/19;
		printf("%d\n",sum);
	} 
	return 0;
}
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值