洛谷题单刷题(4. 数组)

梦中的统计

题目背景
Bessie 处于半梦半醒的状态。过了一会儿,她意识到她在数数,不能入睡。

题目描述
Bessie 的大脑反应灵敏,仿佛真实地看到了她数过的一个又一个数。她开始注意每一个数码(0…9):每一个数码在计数的过程中出现过多少次?

给出两个整数 M 和 N,求在序列 [M,M+1,M+2,…,N−1,N] 中每一个数码出现了多少次。

输入格式
第 1 行: 两个用空格分开的整数 M 和 N。

输出格式
第 1 行: 十个用空格分开的整数,分别表示数码 0…9 在序列中出现的次数。

题解

利用数位分离法

#include<iostream>
using namespace std;

int main()
{
	int m, n, ans[] = { 0,0,0,0,0,0,0,0,0,0 };
	cin >> m >> n;

	for (int i = m; i <= n; i++)
	{
		int j = i;
		while (j != 0)
		{
			int mod = j % 10;
			ans[mod]++;
			j /= 10;
		}
	}

	for (int i = 0; i < 10; i++)
	{
		cout << ans[i] << " ";
	}

	return 0;
}

珠心算测验

题目背景
NOIP2014 普及 T1

题目描述
珠心算是一种通过在脑中模拟算盘变化来完成快速运算的一种计算技术。珠心算训练,既能够开发智力,又能够为日常生活带来很多便利,因而在很多学校得到普及。

某学校的珠心算老师采用一种快速考察珠心算加法能力的测验方法。他随机生成一个正整数集合,集合中的数各不相同,然后要求学生回答:其中有多少个数,恰好等于集合中另外两个(不同的)数之和?

最近老师出了一些测验题,请你帮忙求出答案。

输入格式
共两行,第一行包含一个整数 n,表示测试题中给出的正整数个数。

第二行有 n 个正整数,每两个正整数之间用一个空格隔开,表示测试题中给出的正整数。

输出格式
一个整数,表示测验题答案。

题解

用数组b来判断某个数是否被记录过,若被记录过,则将其对应b中值置为false
防止重复

#include <bits/stdc++.h>
using namespace std;

int a[200];
bool b[20000];

int main()
{
	int n,count = 0;

	cin >> n;

	for (int i = 1; i <= n; i++)
	{
		cin >> a[i];
		b[a[i]] = true;
	}

	for (int i = 1; i <= n; i++)
	{
		for (int j = i + 1; j <= n; j++)
		{
			if (b[a[i] + a[j]])
			{
				count++;
				b[a[i] + a[j]] = false;
			}
		}
	}
    
	cout << count;
	return 0;
}

爱与愁的心痛

题目背景
(本道题目隐藏了两首歌名,找找看哪~~~)

《爱与愁的故事第一弹·heartache》第一章。

《我为歌狂》当中伍思凯神曲《舞月光》居然没赢给萨顶顶,爱与愁大神心痛啊~~~而且最近还有一些令人伤心的事情,都让人心痛(最近真的很烦哈)……

题目描述
最近有 n 个不爽的事,每句话都有一个正整数刺痛值(心理承受力极差)。爱与愁大神想知道连续 m 个刺痛值的和的最小值是多少,但是由于业务繁忙,爱与愁大神只好请你编个程序告诉他。

输入格式
第一行有两个用空格隔开的整数,分别代表 n 和 m。

第 2 到第 (n+1) 行,每行一个整数,第 (i+1) 行的整数 a
i

代表第 i 件事的刺痛值 a
i

输出格式
输出一行一个整数,表示连续 m 个刺痛值的和的最小值是多少。

题解

双循环遍历求和

#include<iostream>
using namespace std;

int n, m, sum = 0, result = 3000000;
const int SIZE = 3e3 + 5;
int arr[SIZE] = { 0 };

int min(int a, int b)
{
	if (a <= b)
		return a;
	else
		return b;
}

int main()
{
	cin >> n >> m;

	for (int i = 1; i <= n; i++)
    {
		cin >> arr[i];
	}
    
	for (int i = 1; i <= n - m + 1; i++)
	{
		for (int j = 0; j < m; j++)
		{
			sum += arr[i + j];
		}
		
		result = min(sum, result);
        sum = 0;
	}

	cout << result;

	return 0;
}

Bovine Bones G

题目描述
Bessie 喜欢桌游和角色扮演游戏,所以她说服了 Farmer John 驾车送她去爱好商店,在那里她购买了三个用于掷骰子的骰子。这些公平的骰子分别有 S
1

、S
2

和 S
3

个面(2≤S
1

≤20;2≤S
2

≤20;2≤S
3

≤40),上面分别包含 1 到 S
1

,S
2

和 S
3

之间的所有整数。Bessie 不断地掷骰子,试图找出哪个三个骰子的点数和出现得最频繁。如果有多个和出现得最频繁,输出其中最小的和。

输入格式
第 1 行:三个用空格分隔的整数:S
1

、S
2

和 S
3

输出格式
第 1 行:当骰子以每种可能的组合掷出时,出现次数最多的最小整数和。

题解

遍历所有可能,把数组对应数的值++

#include <bits/stdc++.h>
using namespace std;

int arr[100005];
int s1, s2, s3;

int main()
{
	int ans = 0, max = 0;

	cin >> s1 >> s2 >> s3;

	for (int i = 1; i <= s1; i++)
	{
		for (int j = 1; j <= s2; j++)
		{
			for (int k = 1; k <= s3; k++)
			{
				arr[i + j + k] += 1;
			}
		}
	}

	for (int i = 1; i <= s1+s2+s3; i++)
	{
		if (arr[i] > max)
		{
			ans = i;
			max = arr[i];
		}
			
	}

	cout << ans;

	return 0;
}

开灯

题目描述
在一条无限长的路上,有一排无限长的路灯,编号为 1,2,3,4,…。

每一盏灯只有两种可能的状态,开或者关。如果按一下某一盏灯的开关,那么这盏灯的状态将发生改变。如果原来是开,将变成关。如果原来是关,将变成开。

在刚开始的时候,所有的灯都是关的。小明每次可以进行如下的操作:

指定两个数,a,t(a 为实数,t 为正整数)。将编号为 ⌊a⌋,⌊2×a⌋,⌊3×a⌋,…,⌊t×a⌋ 的灯的开关各按一次。其中 ⌊k⌋ 表示实数 k 的整数部分。

在小明进行了 n 次操作后,小明突然发现,这个时候只有一盏灯是开的,小明很想知道这盏灯的编号,可是这盏灯离小明太远了,小明看不清编号是多少。

幸好,小明还记得之前的 n 次操作。于是小明找到了你,你能帮他计算出这盏开着的灯的编号吗?

输入格式
第一行一个正整数 n,表示 n 次操作。

接下来有 n 行,每行两个数,a
i

,t
i

。其中 a
i

是实数,小数点后一定有 6 位,t
i

是正整数。

输出格式
仅一个正整数,那盏开着的灯的编号。

题解

注意时间
找到需要的灯的需要之后就返回,防止浪费时间

#include <bits/stdc++.h>
using namespace std;

int arr[2000001];

int main()
{
	int n, t;
    double a;

	cin >> n;

	for (int i = 1; i <= n; i++)
	{
		cin >> a >> t;

        for(int j  = 1;j <= t; j++)
			arr[(int)(a * j)]++;
	}

	for (int i = 1; i <= 2000001; i++)
	{
		if (arr[i] % 2 == 1)
        {
            cout << i;
            return 0;
        }
	}

	return 0;
}

杨辉三角

题目描述
给出 n(1≤n≤20),输出杨辉三角的前 n 行。

如果你不知道什么是杨辉三角,可以观察样例找找规律。
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1

题解

int n, a[21][21];
int main()
{
	cin >> n;
	a[1][1] = 1;
	for (int i = 2; i <= n; i++)
		for (int j = 1; j <= i; j++)
			a[i][j] = a[i - 1][j - 1] + a[i - 1][j];

	for (int i = 1; i <= n; i++)
	{
		for (int j = 1; j <= i; j++)
			printf("%d ", a[i][j]);
		printf("\n");
	}
	return 0;
}

P5730 【深基5.例10】显示屏

题目描述

液晶屏上,每个阿拉伯数字都是可以显示成 3×53\times53×5 的点阵的(其中 X 表示亮点,. 表示暗点)。现在给出数字位数(不超过 100100100)和一串数字,要求输出这些数字在显示屏上的效果。数字的显示方式如同样例输出,注意每个数字之间都有一列间隔。

输入格式

第一行输入一个正整数 nnn,表示数字的位数。

第二行输入一个长度为 nnn 的自然数。

输出格式

输出五行,表示显示屏上的数字。

输入输出样例 #1

输入 #1

10
0123456789

输出 #1

XXX...X.XXX.XXX.X.X.XXX.XXX.XXX.XXX.XXX
X.X...X...X...X.X.X.X...X.....X.X.X.X.X
X.X...X.XXX.XXX.XXX.XXX.XXX...X.XXX.XXX
X.X...X.X.....X...X...X.X.X...X.X.X...X
XXX...X.XXX.XXX...X.XXX.XXX...X.XXX.XXX

说明/提示

数据保证,1≤n≤1001 \leq n \leq 1001n100

题解

打表 一行一行输出 输出完一行再换行
需要三重循环,第一层是行,第二层是遍历所有数字,第三层遍历列。

#include <bits/stdc++.h>
using namespace std;

char cnt[10][5][3] =
{
	{
		'X','X','X',
		'X','.','X',
		'X','.','X',
		'X','.','X',
		'X','X','X',
	},
	{
		'.','.','X',
		'.','.','X',
		'.','.','X',
		'.','.','X',
		'.','.','X',
	},
	{
		'X','X','X',
		'.','.','X',
		'X','X','X',
		'X','.','.',
		'X','X','X',
	},
	{
		'X','X','X',
		'.','.','X',
		'X','X','X',
		'.','.','X',
		'X','X','X',
	},
	{
		'X','.','X',
		'X','.','X',
		'X','X','X',
		'.','.','X',
		'.','.','X',
	},
	{
		'X','X','X',
		'X','.','.',
		'X','X','X',
		'.','.','X',
		'X','X','X',
	},
	{
		'X','X','X',
		'X','.','.',
		'X','X','X',
		'X','.','X',
		'X','X','X',
	},
	{
		'X','X','X',
		'.','.','X',
		'.','.','X',
		'.','.','X',
		'.','.','X',
	},
	{
		'X','X','X',
		'X','.','X',
		'X','X','X',
		'X','.','X',
		'X','X','X',
	},
	{
		'X','X','X',
		'X','.','X',
		'X','X','X',
		'.','.','X',
		'X','X','X',
	}
};

int main()
{
	int n,k;
	char num[110];
	cin >> n;
	cin >> num;

	for (int i = 0; i < 5; i++)
	{
		for (int j = 0; j < n; j++)
		{
			for (k = 0; k < 3; k++)
			{
				cout << cnt[(int)(num[j] - '0')][i][k];
			}
			if (j != n - 1)
				cout << ".";
		}
		cout << "\n";
	}


	return 0;
}

P1320 压缩技术(续集版)

题目描述

设某汉字由 N×NN \times NN×N0\texttt 001\texttt 11 的点阵图案组成。

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

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

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 (第一个数是 NNN,其余各位表示交替表示 0\tt 001\tt 11 的个数,压缩码保证 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≤2003\leq N\leq 2003N200

题解

定义两个字符串,并将b拼接到a之后
再进行统计,最后一定要记得输出t

#include <bits/stdc++.h>
using namespace std;

int main()
{
	int n, t = 1;

	string a, b;

	cin >> b;
	n = b.size();
	cout << n << " ";

	while (cin >> a)
		b += a;

	if (b[0] != '0')
		cout << "0 ";
	for (int i = 1; i < n * n; i++)
	{
		if (b[i] == b[i - 1])
			t++;
		else
		{
			cout << t << " ";
			t = 1;
		}
	}
	cout << t;
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值