纪录洛谷刷题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 3≤N≤200。
代码如下:
#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 3≤N≤200。
代码如下:
#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 的字符串中被反复贴有 boy
和 girl
两单词,后贴上的可能覆盖已贴上的单词(没有被覆盖的用句点表示),最终每个单词至少有一个字符没有被覆盖。问贴有几个 boy
几个 girl
?
输入格式
一行被被反复贴有 boy
和 girl
两单词的字符串。
输出格式
两行,两个整数。第一行为 boy
的个数,第二行为 girl
的个数。
样例 #1
样例输入 #1
......boyogirlyy......girl.......
样例输出 #1
4
2
提示
数据保证, 3 ≤ l ≤ 255 3\le l\le255 3≤l≤255,字符串仅仅包含如下字符: .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 1≤n≤104, 1 ≤ a i ≤ 1 0 9 1 \leq a_i \leq 10^9 1≤ai≤109。
代码如下:
#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 0≤a≤104, 0 ≤ b ≤ 9 0 \leq b \leq 9 0≤b≤9。
代码如下:
#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;
}